📅  最后修改于: 2023-12-03 15:14:29.840000             🧑  作者: Mango
C# 泛型是一种参数化类型,它支持在定义代码时不指定具体类型,而是在使用代码时再指定类型,从而实现代码的复用性和可扩展性。在 C# 中,泛型具有以下特点:
泛型类是使用泛型的一种方式,它可以定义一个通用的类,然后在使用时再指定具体类型。以下是一个泛型类的例子:
public class MyList<T>
{
private List<T> _list = new List<T>();
public void Add(T item)
{
_list.Add(item);
}
public T Get(int index)
{
return _list[index];
}
public int Count
{
get { return _list.Count; }
}
}
在上面的例子中,我们使用了 T
来表示类型参数,它可以被替换为任何类型。创建 MyList
对象时,可以指定具体的类型参数,例如:
MyList<int> intList = new MyList<int>();
intList.Add(1);
intList.Add(2);
intList.Add(3);
Console.WriteLine(intList.Get(0)); // 输出 1
泛型方法是定义一个通用方法,它可以接受不同类型的参数,从而提高代码的复用性。以下是一个泛型方法的例子:
public static T Max<T>(T a, T b) where T : IComparable<T>
{
if (a.CompareTo(b) > 0)
return a;
else
return b;
}
在上面的例子中,我们使用了 T
来表示类型参数,并且使用了 where
语句限制了 T
必须实现 IComparable<T>
接口,从而保证能够比较大小。使用时,可以指定具体的类型参数,例如:
int maxInt = Max(1, 2);
Console.WriteLine(maxInt); // 输出 2
string maxString = Max("abc", "def");
Console.WriteLine(maxString); // 输出 def
泛型约束是一个限制类型参数的方式,从而使得泛型代码更加安全和可靠。以下是一些常见的泛型约束:
where T : class
:指定 T
必须是引用类型。where T : struct
:指定 T
必须是值类型。where T : new()
:指定 T
必须有公共无参数的构造函数。where T : SomeInterface
:指定 T
必须实现 SomeInterface
接口。例如,以下是一个使用泛型约束的例子:
public static T Clone<T>(T obj) where T : ICloneable
{
return (T)obj.Clone();
}
在上面的例子中,我们使用了 where
语句限制了 T
必须实现 ICloneable
接口,从而保证可以使用 Clone
方法进行复制。使用时,可以指定具体的类型参数,例如:
int[] numbers = { 1, 2, 3 };
int[] clonedNumbers = Clone(numbers);
Console.WriteLine(clonedNumbers[0]); // 输出 1