1 泛型概述
在 C# 中,泛型是一个强大的特性,允许你在定义类、接口、方法时,使用类型参数来提高代码的灵活性和可重用性。泛型的引入使得我们可以编写类型安全的代码,同时避免类型转换带来的性能损失和潜在的运行时错误。
为什么使用泛型?
使用泛型的主要优势在于:
- 类型安全:泛型能够确保类型安全,在编译时检查类型,提高了代码的安全性。
- 性能优化:通过消除装箱和拆箱操作,提升了性能,特别是在使用值类型时。
- 代码重用:泛型可以让你编写更加通用的代码,而无需为每种数据类型编写重复的代码。
泛型类
一个基本的泛型类示例如下:
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
可以被任何类型所替代。你可以这样使用这个泛型类:
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# 也支持泛型方法。你可以在方法中定义一个或多个类型参数。
public static T Max<T>(T x, T y) where T : IComparable
{
return x.CompareTo(y) > 0 ? x : y;
}
在这个例子中,Max
方法接受两个相同类型的参数并返回较大的一个。你可以这样使用它:
int maxInt = Max(5, 10); // 输出 10
string maxString = Max("apple", "banana"); // 输出 banana
泛型接口
C# 还允许定义泛型接口。泛型接口与泛型类类似,在接口中定义类型参数。
public interface IRepository<T>
{
void Add(T item);
T Get(int id);
}
实现泛型接口的类如下:
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
泛型类的方式如下:
IRepository<string> repo = new Repository<string>();
repo.Add("Item1");
repo.Add("Item2");
Console.WriteLine(repo.Get(0)); // 输出 Item1
约束
泛型的一个重要特性是可以为类型参数设置约束,以指定使用泛型类型时满足的条件。
public class GenericClass<T> where T : IDisposable
{
public void Dispose(T item)
{
item.Dispose();
}
}
在这个例子中,GenericClass<T>
的类型参数 T
被约束为实现 IDisposable
接口的类型,这样你就可以安全地调用 Dispose
方法。
总结
泛型大大增强了 C# 的类型系统,使得开发者能够编写更加安全、高效和可重用的代码。通过理解和应用泛型特性,我们可以在构建复杂应用程序时避免许多常见的错误和性能瓶颈。
在下一篇文章中,我们将深入探讨 C# 的动态类型特性,这也是一种实现灵活性的强大工具。欢迎继续关注!
No previous page