Параметры универсального типа (Руководство по программированию на C#)
В определении универсального типа или метода параметры типа представляют собой заполнитель для определенного типа, задаваемого клиентом при создании переменной универсального типа.Универсальный класс, такой как GenericList<T> listed in Введение в универсальные шаблоны. (Руководство по программированию на C#), нельзя использовать "как есть", поскольку он является не типом а, скорее, чертежом типа.Для работы с GenericList<T> в клиентском коде необходимо объявить и создать конструируемый тип, указав в угловых скобках аргумент типа.Аргумент-тип для этого конкретного класса может быть любым типом, распознаваемым компилятором.Можно создать любое количество экземпляров конструируемых типов, и каждый из них может использовать разные аргументы типа, как показано далее.
GenericList<float> list1 = new GenericList<float>();
GenericList<ExampleClass> list2 = new GenericList<ExampleClass>();
GenericList<ExampleStruct> list3 = new GenericList<ExampleStruct>();
В каждом экземпляре GenericList<T> каждое вхождение T в классе будет заменено во время выполнения аргументом типа.С помощью данной замены было создано три отдельных типобезопасных и эффективных объекта, использующих определение класса.Дополнительные сведения о выполнении этой замены в CLR см. раздел Универсальные типы во время выполнения (Руководство по программированию в C#).
Рекомендации по именованию параметра типа
При именовании параметров универсальных типов используйте описательные имена, если только однобуквенное имя не является полностью понятным без пояснений, вследствие чего нет необходимости применять описательное имя.
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; } }
В имени параметра рекомендуется указывать ограничения, накладываемые на параметр типа.Например, параметр, предназначенный только для ISession, может называться TSession.
См. также
Ссылки
Универсальные шаблоны (Руководство по программированию на C#)