泛型是C#中一种强大的特性,它允许你编写类型安全且灵活的代码。泛型允许你定义类、方法、接口、数组、委托等,而不需要在编译时指定具体的类型。这样,你可以创建一个组件,它可以在不同的类型上重用,同时保持类型安全。
泛型的优点:
- 类型安全:泛型在编译时检查类型,减少了运行时错误。
- 性能:泛型避免了装箱和拆箱操作,提高了性能。
- 代码重用:泛型允许你编写一次代码,然后在多种类型上使用。
- 减少类型转换:泛型消除了显式类型转换的需要。
泛型类和结构
泛型类或结构定义时使用类型参数 <T>
(通常使用单字母标识符,如 T
、K
、V
等),这些参数在类或结构的名称后面用尖括号括起来。
public class GenericList<T>
{
private List<T> _items = new List<T>();
public void Add(T item)
{
_items.Add(item);
}
public T Get(int index)
{
return _items[index];
}
}
泛型接口
泛型接口使用方式与泛型类类似,定义时指定类型参数。
public interface IGenericCollection<T>
{
void Add(T item);
T Get(int index);
}
泛型方法
泛型方法可以在方法级别指定类型参数,而不需要创建泛型类。
public class Program
{
public static void PrintArray<T>(T[] array)
{
foreach (T item in array)
{
Console.WriteLine(item);
}
}
}
泛型委托
泛型委托允许你定义一个委托,其参数和返回类型都是泛型的。
public delegate R GenericDelegate<T, R>(T t);
泛型约束
泛型可以有约束,这意味着你可以指定类型参数必须继承自特定的类或实现特定的接口。
public class GenericClass<T> where T : class
{
// T 必须是引用类型
}
public class GenericClass<T> where T : struct
{
// T 必须是值类型
}
public class GenericClass<T> where T : IComparable
{
// T 必须实现 IComparable 接口
}
泛型数组
泛型数组允许你创建特定类型的数组。
int[] intArray = new int[10];
GenericList<int> list = new GenericList<int>();
协变和逆变
协变允许你使用派生类的实例来替代基类的实例。逆变允许你使用基类的实例来替代派生类的实例。
IEnumerable<Base> bases = new List<Derived>(); // 协变
Action<Base> baseAction = (Action<Derived>)action; // 逆变
静态类型和动态类型
泛型提供了静态类型(编译时类型安全)和动态类型(运行时类型安全)。
泛型字典
.NET 提供了 Dictionary<TKey, TValue>
泛型集合,用于存储键值对。
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "One");
string value = dictionary[1];
泛型是.NET编程中不可或缺的一部分,它们提供了一种灵活的方式来处理类型,使得代码更加安全、高效和可重用。