类型参数T
泛型的类型参数T可以看作是一个占位符,它不是一种类型,它仅代表了某种可能的类型。类型参数T可以在使用时用任何类型来代替。
类型参数T的命名准则如下:
使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。
public interface ISessionChannel<TSession>
{
TSession session{ get;}
}
泛型接口
Interface 接口名 <T>
{
接口体
}
在实例化泛型时也可以使用约束对类型参数的类型种类施加限制,约束是使用where上下文关键字指定的。下面列出了6种类型的约束:
a).T:结构——类型参数必须是值类型。可以指定除Nullable以外的任何值类型。
b).T:类——类型参数必须是引用类型。这一点也使用于任何类、接口、委托或数组类型。
c).T:new()——类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。
d).T:<基类名>——类型参数必须是指定的基类或派生自指定的基类。
e).T:<接口名称>——类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
f).T:U——为T提供的类型参数必须是为U提供的参数或派生自为U提供的参数。这称为裸类型约束。
// 创建一个泛型接口
public interface IGenericInteface<T>
{
T CreateInstance();
}
// 实现上面泛型接口的泛型类
// 派生约束 where T:TI(T要继承自TI)
// 构造函数约束where T:new()(T可以实例化)
public class Factory<T, TI>: IGenericInteface<TI> where T:TI,new()
{
public TI CreateInstance()
{
return new T();
}
}
泛型方法
修饰符 void 方法名<类型参数 T>
{
}
注:泛型方法可以使用多类型参数进行重载。
Public static int Find<T>(T[] items, T item)
{}
Int I = Finer.Find<int>(new int[]{1,2,3,4,5,6}, 6);
《C#从入门到精通》读后总结