C#中的泛型
泛型提供了一种更优雅的方式,可以让多个类型共享这一组代码,泛型允许声明类型参数化,用不同的类型进行实例化,在创建类的实例时指明真实的类型。
在C#中,提供了5种泛型:类、结构、接口、委托、方法,前面4种是类型,方法是成员
泛型类
如何声明一个泛型类:
- 在某些类型上使用占位符声明一个类。
- 为占位符提供真实数据类型,这样就有了真实类的定义。
- 创造构造类型的实例。
声明泛型类
- 在类名之后放置一组尖括号。
- 在尖括号中用逗号分隔的占位符字符串表示需要提供的类型,这叫做类型参数。
- 在泛型类声明的主体中使用类型参数来表示代替类型。
例如:
namespace CSharpProject1;
class MyStack<T>
{
private T[] StackArray;
private int StackPointer = 0;
private int StackMaxLength = 10;
public void Push(T x)
{
if (!IsStackFull()) StackArray[StackPointer++] = x;
}
public T Pop()
{
if (!IsStackEmpty()) return StackArray[--StackPointer];
}
public bool IsStackFull()
{
return (StackMaxLength == StackPointer) ? true : false;
}
public bool IsStackEmpty()
{
return (StackPointer == 0) ? true : false;
}
}
class Program
{
static void Main(string[] args)
{
MyStack<int> stack = new MyStack<int>();
}
}
泛型委托
泛型委托和非泛型委托非常相似,不过类型参数决定了能接收什么样的方法。
-
要声明泛型委托,在委托名称之后、委托参数列表之前的尖括号中放置类型参数列表。
delegate R MyDelegate<T, R>(T value);
例如:
namespace CSharpProject1;
delegate T Func<T1, T2, T>(T1 t1, T2 t2);
class Simple
{
static public string PrintString(int t1, int t2)
{
int total = t1 + t2;
return total.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var MyDeleGate = new Func<int, int, string> (Simple.PrintString);
string res = MyDeleGate.Invoke(15, 13);
Console.WriteLine($"{res}");
}
}
D:/RiderProjects/CSharpProject1/CSharpProject1/bin/Debug/net8.0/CSharpProject1.exe
28
Process finished with exit code 0.
协变和逆变
在创建泛型类型的实例,编译器会接收泛型类型声明以及类型实参来创建构造类型。