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;}

}