Поделиться через


Преимущества и ограничения универсальных шаблонов

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

Предоставляя возможность задавать типы, над которыми производятся действия в универсальном классе или методе, универсальные шаблоны тем самым позволяют передать компилятору обязанности обеспечения типовой безопасности. Нет необходимости написания кода для проверки правильности типа данных, так как проверка происходит во время компиляции. Уменьшается потребность приведения типов и вероятность ошибок во время выполнения.

Универсальные шаблоны обеспечивают типовую безопасность без дополнительных расходов, связанных с многократными реализациями. Например, можно создать связанный список строк со следующим описанием переменной:

Dim llist As New LinkedList(Of String)
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

Нет необходимости наследования базового типа и преобладающих членов. Теперь связанный список готов к использованию. Обратитесь к разделу System.Collections.Generic и System.Collections.ObjectModel для получения сведений об универсальных типах коллекций, предоставляемых .NET Framework.

В дополнение к типовой безопасности, универсальные типы коллекций обычно имеют более высокую производительность при хранении и управлении типами значений, поскольку отсутствует необходимость их упаковки.

Универсальные делегаты поддерживают строго типизированные обратные вызовы без необходимости создания нескольких делегатских классов. Например, универсальный делегат Predicate<T> позволяет создать метод, который реализует собственные условия поиска для определенного типа, и использовать ваш метод с методами типа Array, такими как Find<T>, FindLast<T> и FindAll<T>.

Универсальные делегаты можно также использовать в динамически создаваемом коде без необходимости создания типа делегата. Это увеличивает количество ситуаций, в которых можно использовать облегченные динамические методы вместо создания целых сборок. Дополнительные сведения смотрите в разделах Практическое руководство. Определение и выполнение динамических методов и DynamicMethod.

Во многих случаях компиляторы Visual Basic, Visual C++ и C# могут определить из контекста типы, которые используются при вызове универсального метода, что значительно упрощает синтаксис для использования универсальных методов. Например, в следующем коде показаны короткие и длинные формы вызова универсального метода BinarySearch для поиска массива строк. В короткой форме компиляторы определяют нужный параметр типа из типов аргументов метода.

Dim index As Integer = Array.BinarySearch(myArray, "test string")
Dim index As Integer = _
    Array.BinarySearch(Of String)(myArray, "test string")
int index = Array.BinarySearch(myArray, "test string");
int index = Array.BinarySearch<string>(myArray, "test string");
int index = Array::BinarySearch(myArray, "test string");
int index = Array::BinarySearch<String^>(myArray, "test string");

Ограничения универсальных шаблонов

Ниже перечислены некоторые ограничения универсальных шаблонов в .NET Framework, версия 2.0.

  • Универсальные типы могут быть наследованы от большинства базовых классов, таких как MarshalByRefObject (а ограничения могут использоваться для обеспечения того, чтобы параметры универсальных типов наследовались от базовых классов MarshalByRefObject). Тем не менее, данная версия .NET Framework не поддерживает контекстно-связанные универсальные типы. Универсальный тип может быть производным от ContextBoundObject, но при попытке создать экземпляр этого типа вызывается TypeLoadException.

  • Перечисления не могут иметь параметров универсальных типов. Перечисление может быть универсальным только случайно (например, если оно является вложенным в универсальный тип, который определен с помощью Visual Basic, C# или C++). Дополнительные сведения смотрите в разделе Перечисления в системе общих типов CTS.

  • Облегченные динамические методы не могут быть универсальными. Дополнительные сведения о динамических методах содержатся в разделе Сценарии динамических методов порождения отражения.

  • В Visual Basic, C# и C++ вложенный тип, заключенный в универсальном типе, не может быть использован для создания объекта, кроме тех случаев, когда типы были назначены параметрам типа всех заключенных типов. Другими словами, вложенный тип, который определен с помощью этих языков, включает параметры типов всех его заключенных типов. Это позволяет использовать параметры типа заключающих типов в определениях членов вложенного типа. Дополнительные сведения смотрите в разделе "Вложенные типы" в MakeGenericType.

    ms172194.alert_note(ru-ru,VS.90).gifПримечание.

    Вложенный тип, который определен с помощью выпуска кода в динамическую сборку или с помощью Ассемблер MSIL (Ilasm.exe), не требует включать параметры типа составляющих.

    Дополнительные сведения смотрите в разделе "Вложенные типы" в MakeGenericType.

См. также

Основные понятия

Общие сведения об универсальных шаблонах в .NET Framework

Универсальные коллекции в .NET Framework

Универсальные делегаты для управления массивами и списками

Универсальные интерфейсы

Ссылки

System.Collections.Generic

System.Collections.ObjectModel

Другие ресурсы

Универсальные шаблоны в платформе .NET Framework