1 泛型概述

在 C# 中,泛型是一个强大的特性,允许你在定义类、接口、方法时,使用类型参数来提高代码的灵活性和可重用性。泛型的引入使得我们可以编写类型安全的代码,同时避免类型转换带来的性能损失和潜在的运行时错误。

为什么使用泛型?

使用泛型的主要优势在于:

  1. 类型安全:泛型能够确保类型安全,在编译时检查类型,提高了代码的安全性。
  2. 性能优化:通过消除装箱和拆箱操作,提升了性能,特别是在使用值类型时。
  3. 代码重用:泛型可以让你编写更加通用的代码,而无需为每种数据类型编写重复的代码。

泛型类

一个基本的泛型类示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class GenericList<T>
{
private T[] items;
private int count;

public GenericList(int size)
{
items = new T[size];
count = 0;
}

public void Add(T item)
{
if (count < items.Length)
{
items[count++] = item;
}
}

public T Get(int index)
{
if (index < count)
{
return items[index];
}
throw new IndexOutOfRangeException();
}
}

在这个例子中,GenericList<T> 是一个泛型类,其中 T 可以被任何类型所替代。你可以这样使用这个泛型类:

1
2
3
4
5
6
7
8
9
10
GenericList<int> intList = new GenericList<int>(10);
intList.Add(1);
intList.Add(2);
intList.Add(3);
Console.WriteLine(intList.Get(0)); // 输出 1

GenericList<string> stringList = new GenericList<string>(10);
stringList.Add("Hello");
stringList.Add("World");
Console.WriteLine(stringList.Get(1)); // 输出 World

泛型方法

除了泛型类外,C# 也支持泛型方法。你可以在方法中定义一个或多个类型参数。

1
2
3
4
public static T Max<T>(T x, T y) where T : IComparable
{
return x.CompareTo(y) > 0 ? x : y;
}

在这个例子中,Max 方法接受两个相同类型的参数并返回较大的一个。你可以这样使用它:

1
2
int maxInt = Max(5, 10); // 输出 10
string maxString = Max("apple", "banana"); // 输出 banana

泛型接口

C# 还允许定义泛型接口。泛型接口与泛型类类似,在接口中定义类型参数。

1
2
3
4
5
public interface IRepository<T>
{
void Add(T item);
T Get(int id);
}

实现泛型接口的类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Repository<T> : IRepository<T>
{
private List<T> items = new List<T>();

public void Add(T item)
{
items.Add(item);
}

public T Get(int id)
{
return items[id];
}
}

使用 Repository 泛型类的方式如下:

1
2
3
4
IRepository<string> repo = new Repository<string>();
repo.Add("Item1");
repo.Add("Item2");
Console.WriteLine(repo.Get(0)); // 输出 Item1

约束

泛型的一个重要特性是可以为类型参数设置约束,以指定使用泛型类型时满足的条件。

1
2
3
4
5
6
7
public class GenericClass<T> where T : IDisposable
{
public void Dispose(T item)
{
item.Dispose();
}
}

在这个例子中,GenericClass<T> 的类型参数 T 被约束为实现 IDisposable 接口的类型,这样你就可以安全地调用 Dispose 方法。

总结

泛型大大增强了 C# 的类型系统,使得开发者能够编写更加安全、高效和可重用的代码。通过理解和应用泛型特性,我们可以在构建复杂应用程序时避免许多常见的错误和性能瓶颈。

在下一篇文章中,我们将深入探讨 C# 的动态类型特性,这也是一种实现灵活性的强大工具。欢迎继续关注!

作者

AI免费学习网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论