泛型:编写一个可以与任何数据类型一起工作的类或方法。延迟确定数据类型,直到实际在程序中使用它的时候。
泛型类:
public class MyGenericArray<T>
{
private T[] array;
public MyGenericArray(int size)
{
array = new T[size+1];
}
public T getItem(int index)
{
return array[index];
}
public void setItem(int index,T value)
{
array[index] = value;
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
MyGenericArray<int> intArray = new MyGenericArray<int>(5);
MyGenericArray<string> stringArray = new MyGenericArray<string>(5);
}
}
泛型的特性:
- 最大限度重用代码、保护类型的安全以及提高性能。
- 创建泛型集合类。
- 创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 可以对泛型类进行约束以访问特定数据类型的方法。
- 泛型数据类型中使用的信息可以在运行时通过反射获取。
泛型方法:通过类型参数声明泛型方法
public class GenericMethod
{
public static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
int a, b;
a = 10;
b = 10;
GenericMethod.Swap<int>(ref a,ref b);
}
}
泛型委托:
delegate T NumberChanger<T>(T n);
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
}
}
泛型约束:
using System;
using System.Web.Caching;
namespace Demo.CacheManager
{
public class CacheHelper<T> where T:new()
{
}
}
- T:结构(类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型)
- T:类 (类型参数必须是引用类型,包括任何类、接口、委托或数组类型)
- T:new() (类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时new() 约束必须最后指定)
- T:<基类名> 类型参数必须是指定的基类或派生自指定的基类
- T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
- T:U