17.4 类型参数
在泛型类型或方法的定义中,类型参数是在实例化泛型类型的变量时指定的类型占位符。类型参数可以被编译器识别的任何类型所替代。使用不同的类型实参可以创建任意数目的构造类型实例,对于Stack<T>这一泛型类型,分别使用int和string两种类型,创建了两个构造类型实例,如代码清单17-6所示。
代码清单17-6 使用不同的类型参数创建不同的构造类型实例
Stack<int>intStack=new Stack<int>(5);
Stack<string>stringStack=new Stack<string>(5);
在每个Stack<T>实例中,类中出现的每个类型参数T在运行时都会被替换为某种具体类型。通过这种替换方式,可以使用一个泛型类型创建两个或者更多的独立的、类型安全的有效对象。
类型参数还可以细分为:
❑类型形参:顾名思义,作为形式参数的类型参数叫做类型形参,如Stack<T>中的T。
❑类型实参:实例化泛型类型时提供给类型形参的某个具体类型是类型实参,如Stack<string>中的string。
最后,讨论下类型参数的命名这个话题,并且只有T可以作为类型参数的名称,也可以使用其他的标识符,如果能遵守如下几个规则,程序的可读性将会更好,这些规则并非需要同时遵守,可以根据情况选择遵守其中的一个。规则如下:
❑要使用描述性名称命名类型参数,除非单个字母名称完全可以让人了解其含义,例如:
public interface ISessionChannel<TSession>{/……/}
public delegate TOutput Converter<TInput,TOutput>(TInput from);
public class List<T>{/……/}
❑如果要使用单个字母的类型参数,那么使用T作为类型参数名吧,例如:
public int IComparer<T>(){return 0;}
public delegate bool Predicate<T>(T item);
public struct Nullable<T>where T:struct{/……/}
❑如果需要一个更加有描述性的名称,也可将"T"作为类型参数名的前缀,例如:
public interface ISessionChannel<TSession>
{
TSession Session{get;}
}