Обобщения в C#

Поддержка обобщений (generics) — одно из наиболее впечатляющих нововведений в языке С#. С помощью синтаксиса обобщений можно определить тип, зависящий от другого типа, который не специфицирован в точке определения, а вместо этого определен в точке использования обобщенного типа.

Для примера рассмотрим некоторый тип коллекции. С применением типов коллекций обычно создаются такие вещи, как списки, очереди и стеки. Типы коллекций, существующие со времен .NET 1.0, предназначены для хранения любых типов в CLR, поскольку они содержат экземпляры Object и все, что наследуется от Object.

Однако при этом вся информация о конкретном типе элементов коллекции отбрасывается, и все умение компилятора отлавливать ошибки типа оказывается непригодным.

Ссылку типа, полученную из этой коллекции, можно приводить к любому другому типу, который, по идее, должен иметь элемент, а это может привести к сбою во время выполнения. К тому же первоначальные типы коллекций могут содержать произвольную смесь типов элементов вместо того, чтобы принуждать пользователя в коллекцию вставлять только экземпляры определенного типа.

Можно попробовать решить эту проблему, разработав собственные типы, такие как ListOf Integers и ListOf Strings, для каждого типа, который планируется хранить в коллекции. Однако очень скоро обнаружится, что большая часть управляемого кода таких списков будет похожей, или обобщенной, независимо от типа хранимых элементов.

Ключевым понятием здесь является обобщенный. Появляется возможность объявить открытый (или обобщенный) тип и написать общий код лишь однажды.

Пользователь этого типа может затем указать, какой тип элементов будет содержать коллекция, прямо в точке, где он решит использовать ее.

Вдобавок применение обобщений сулит выигрыш в эффективности.

Синтаксис обобщений покажется знакомым тем, кто применял шаблоны С++. Однако важно отметить, что между ними и обобщениями С# есть существенные отличия в поведении

Наиболее распространенное применение обобщений касается объявления типов коллекций. Например, рассмотрим следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic
using System.Collections.ObjectModel;
class EntryPoint
{
static void Main()  {
Collection<int> numbers =
new Collection<int> ();
numbers.Add( 42 );
numbers.Add( 40 9 );
Collection<string> strings =
new Collection<string> ();
strings.Add( "Joe" );
strings.Add( "Bob" ) ;
Collection< Collection<int> > colNumbers
= new Collection<collection<int»();
colNumbers.Add( numbers );
IList<int> theNumbers = numbers;
foreach( int i in theNumbers )  {
Console.WriteLine ( i );
}

В этом примере продемонстрировано использование обобщенного типа Collection. На это указывают угловые скобки, окружающие имя типа. В данном случае объявлена коллекция целых чисел, коллекция строк и, чтобы продемонстрировать более сложное применение обобщений — коллекция коллекций целых чисел. Кроме того, обратите внимание на объявление обобщенного интерфейса, а именно — iListo.

Когда задается аргумент-тип для обобщенного типа с указанием его в фигурных скобках, как в случае Collection, тем самым объявляется закрытый тип. В этом случае Collection принимает только один параметр типа, но если бы он принимал больше, то их следовало бы разделить запятыми.

Когда CLR впервые встречает такое объявление типа, то генерирует закрытый тип на основе данного обобщенного типа и применяет аргументы типа.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100