在通用類型(Generic type)或方法定義中,類型(type)參數是客戶端在創建通用類型的實例時指定的特定類型的占位符(placeholder),泛型類(例如,泛型簡介中給出的(GenericList<T>)不能按照原樣使用,因為它實際上不是類型。它更像是一種類型的藍圖。要使用GenericList<T>客戶端代碼必須通過在尖括號內指定類型實參來聲明並實例化構造的類型。此特定類型的類型參數可以是編譯器可以識別的任何類型。可以創建任意數量的構造類型實例,每個實例使用不同的類型參數如下所示:
GenericList<float> list1 = new GenericList<float>(); GenericList<ExampleClass> list2 = new GenericList<ExampleClass>(); GenericList<ExampleStruct> list3 = new GenericList<ExampleStruct>();
在GenericList<T>的所有這些實例中,類中每次出現的T都在運行時用type參數替換。通過這種替換,我們使用單個類定義創建了三個單獨的類型安全和有效的對象。有關CLR如何執行此替換的更多信息,請參見運行中的泛型
類型參數命名准則:
1、用描述性名稱來命名通用類型參數,除非單個字母名稱完全可以自我解釋,並且描述性名稱不會增加價值。
public interface ISessionChannel<TSession> { /*...*/ } public delegate TOutput Converter<TInput, TOutput>(TInput from); public class List<T> { /*...*/ }
2、對於具有一個字母類型參數的類型,請考慮使用T作為類型參數名稱。
public int IComparer<T>() { return 0; } public delegate bool Predicate<T>(T item); public struct Nullable<T> where T : struct { /*...*/ }
3、在描述性類型參數名稱前添加T作為前綴
public interface ISessionChannel<TSession> { TSession Session { get; } }
4、考慮以參數名稱指示放置在類型參數上的約束。例如,約束到ISession的參數可以成為TSession