Общие сведения об универсальных шаблонах в .NET Framework
Обновлен: Ноябрь 2007
В этом разделе содержатся общие сведения об универсальных шаблонах платформы .NET Framework и сводка по универсальным типам или методам. В нем также определяется терминология, используемая в обсуждении универсальных шаблонов.
Определение и использование универсальных шаблонов
Универсальными шаблонами являются классы, структуры, интерфейсы и методы, которые имеют прототипы (параметры типов) для одного или нескольких типов, которые они хранят или используют. Класс универсальной коллекции может использовать параметр типа в качестве заполнителя для типа объектов, которые в нем хранятся. Параметры типа отображаются как типы его полей и типы параметров его методов. Универсальный метод может использовать параметр типа как тип своего возвращаемого значения или как тип одного из своих формальных параметров. Следующий код иллюстрирует определение простого универсального класса.
Public Class Generic(Of T)
Public Field As T
End Class
public class Generic<T>
{
public T Field;
}
generic<typename T> public ref class Generic
{
public:
T Field;
};
При создании экземпляра универсального класса необходимо указать фактические типы для замены параметров типа. При этом создается новый универсальный класс, к которому относятся как к сконструированному универсальному классу с выбранными типами, заменяющими все параметры типа. Результатом является строго типизированный класс, соответствующий вашему выбору типов, как показано в следующем коде.
Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";
Терминология универсальных шаблонов
Следующие термины используются в обсуждении универсальных шаблонов в .NET Framework:
Определение универсального типа — это объявление класса, структуры или интерфейса, которое работает в качестве шаблона с прототипами для типов, которые он может содержать или использовать. Например, класс Dictionary<TKey, TValue> может содержать два типа: ключи и значения. Поскольку это только шаблон, то нельзя создавать экземпляры класса, структуры, или интерфейса, являющихся определением универсального типа.
Параметры универсального типа или параметры типа являются прототипами в определении универсального типа или метода. Универсальный тип Dictionary<TKey, TValue> имеет два параметра типа TKey и TValue, которые представляют типы его ключей и значений.
Сконструированный универсальный тип или сконструированный тип является результатом указания типов для параметров универсального типа в определении универсального типа.
Аргумент универсального типа является любым типом, заменяемым на параметр универсального типа.
Общий термин универсальный тип включает в себя сконструированные типы и определения универсальных типов.
Ограничения — это пределы, наложенные на параметры универсального типа. Например, можно ограничить параметр типа типами, реализующими универсальный интерфейс IComparer<T>, чтобы обеспечить упорядочивание экземпляров типа. Можно также ограничить параметры типа типами, имеющими определенный базовый класс, который имеет конструктор по умолчанию, или типами, являющимися ссылочными типами или типами значений. Пользователи универсального типа не могут подставить аргументы типа, которые не удовлетворяют ограничениям.
Определение универсального метода — метод с двумя списками параметров: список параметров универсальных типов и список формальных параметров. Параметры типа могут появляться в качестве возвращаемого типа или в качестве типов формальных параметров, как показано в следующем коде.
Function Generic(Of T)(ByVal arg As T) As T Dim temp As T = arg ... End Function
T Generic<T>(T arg) { T temp = arg; ...}
generic<typename T> T Generic(T arg) { T temp = arg; ...};
Универсальные методы могут присутствовать в универсальных или в стандартных типах. Обратите внимание, что метод не является универсальным лишь потому, что он принадлежит универсальному типу или даже в том случае, если он имеет формальные параметры, типы которых являются универсальными параметрами для включающего их типа. Метод является универсальным только в том случае, если он имеет свой собственный список параметров типа. В следующем коде только метод G является универсальным.
Class A Function G(Of T)(ByVal arg As T) As T ... End Function End Class Class Generic(Of T) Function M(ByVal arg As T) As T ... End Function End Class
class A { T G<T>(T arg) {...} } class Generic<T> { T M(T arg) {...} }
ref class A { generic<T> T G(T arg) {...}; }; generic<typename T> ref class Generic { T M(T arg) {...}; };
В Visual С++, C# и Visual Basic предоставляется полная поддержка определения и использования универсальных шаблонов. Дополнительные сведения см. в разделах Универсальные типы в Visual Basic, Введение в универсальные шаблоны. (Руководство по программированию на C#) и Overview of Generics in Visual C++.
Вложенные типы и универсальные шаблоны
Тип, вложенный в универсальный тип, может зависеть от параметров типа этого универсального типа. Среда CLR рассматривает вложенные типы как универсальные, даже если они не имеют своих собственных параметров универсального типа. При создании экземпляра вложенного типа необходимо задать аргументы типа для всех включающих его универсальных типов.
См. также
Задачи
Практическое руководство. Определение универсального типа с порождаемым отражением
Основные понятия
Когда следует использовать универсальные коллекции
Универсальные типы в Visual Basic
Overview of Generics in Visual C++
Универсальные коллекции в .NET Framework
Универсальные делегаты для управления массивами и списками
Преимущества и ограничения универсальных шаблонов
Ссылки
System.Collections.ObjectModel
Введение в универсальные шаблоны. (Руководство по программированию на C#)
Другие ресурсы
Часто используемые типы коллекций