在C#中,泛型(Generics)是一种允许程序员编写与数据类型无关的代码的技术。泛型类型或方法可以在编译时指定具体类型,从而提供更好的类型安全性和性能。
泛型类型:使用类型参数定义的类、接口或结构体。例如,List<T>
是一个泛型类,其中 T
是类型参数。
实例化泛型类型:创建泛型类的具体实例时,需要为类型参数指定一个具体的类型。
假设我们有一个简单的泛型类 Box<T>
,用于存储任意类型的对象:
public class Box<T>
{
private T _value;
public Box(T value)
{
_value = value;
}
public T GetValue()
{
return _value;
}
public void SetValue(T value)
{
_value = value;
}
}
我们可以为 Box<T>
指定不同的类型参数来创建实例:
// 实例化一个存储整数的 Box
Box<int> intBox = new Box<int>(123);
Console.WriteLine(intBox.GetValue()); // 输出: 123
// 实例化一个存储字符串的 Box
Box<string> stringBox = new Box<string>("Hello, World!");
Console.WriteLine(stringBox.GetValue()); // 输出: Hello, World!
List<T>
、Dictionary<TKey, TValue>
。IEnumerable<T>
。List<T>
、Dictionary<TKey, TValue>
。如果你尝试实例化一个泛型类型参数,但该参数是一个抽象类或接口,编译器会报错。
解决方法:使用反射或提供一个具体类型的构造函数。
public class GenericFactory<T> where T : new()
{
public T CreateInstance()
{
return new T();
}
}
// 使用示例
GenericFactory<MyClass> factory = new GenericFactory<MyClass>();
MyClass instance = factory.CreateInstance();
如果你在泛型类或方法中使用了多个约束,可能会出现约束冲突。
解决方法:仔细检查约束条件,确保它们之间没有冲突。
public class ConstrainedBox<T> where T : IComparable, new()
{
private T _value;
public ConstrainedBox(T value)
{
_value = value;
}
public bool IsGreaterThan(T other)
{
return _value.CompareTo(other) > 0;
}
}
通过这些方法和示例,你应该能够在C#中有效地实例化和使用泛型类型。
领取专属 10元无门槛券
手把手带您无忧上云