Параметры универсального типа (Руководство по программированию на C#)

Обновлен: Ноябрь 2007

В определении универсального типа или метода параметры типа представляют собой заполнитель для определенного типа, задаваемого клиентом при создании переменной универсального типа. Универсальный класс, такой как 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#

Ссылки

Универсальные шаблоны (Руководство по программированию на C#)

Различия между шаблонами языка C++ и универсальными шаблонами языка C# (руководство по программированию в C#)

System.Collections.Generic