Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Анонимные типы41

Анонимные типы предлагают удобный способ инкапсулирования набора свойств только для чтения в один объект без необходимости предварительного явного определения типа. Имя типа создается компилятором и недоступно на уровне исходного кода. Тип свойств выводится компилятором. В следующем примере показан анонимный тип, который инициализируется двумя свойствами: Amount и Message.

var v = new { Amount = 108, Message = "Hello" };

Анонимные типы обычно используются в предложении select выражения запроса для возврата подмножества свойств из каждого объекта в исходной последовательности.

Анонимные типы создаются при помощи оператора new с инициализатором объекта. Дополнительные сведения об инициализаторах объектов см. в разделе Инициализаторы объектов и коллекций.

Анонимные типы — это типы class, состоящие из одного или более открытых свойств только для чтения. Все остальные виды членов класса, такие как методы или события, запрещены.

Обычно анонимный тип инициализируется определенными свойствами другого типа. В приведенном ниже примере используется класс Product, включающий свойства Color и Price, а также несколько других свойств, которые нас не интересуют. Products — это коллекция объектов Product. Анонимные объявления типа начинаются с ключевого слова new. Оно инициализирует новый тип, который использует только два свойства из класса Product. Это приводит к уменьшению объема возвращаемых данных.

Если не указать имена членов в анонимном типе, компилятор присвоит этим членам имя свойства, которое используется для их инициализации. Для свойства, которое инициализируется выражением, необходимо указывать имя.

var productQuery =

from prod in products

select new { prod.Color, prod.Price };

foreach (var v in productQuery)

{

Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);

}

When an anonymous type is assigned to a variable, that variable must be initialized with the var construct. This is because only the compiler has access to the underlying name of the anonymous type.

Remarks

Anonymous types are reference types that derive directly from object. The compiler gives them a name although your application cannot access it. From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

If two or more anonymous types have the same number and type of properties in the same order, the compiler treats them as the same type and they share the same compiler-generated type information.

An anonymous type has method scope. To pass an anonymous type, or a collection that contains anonymous types, outside a method boundary, you must first cast the type to object. However, this defeats the strong typing of the anonymous type. If you must store your query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

Anonymous types cannot contain unsafe types as properties.

Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashcode of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

----

Если переменной назначается анонимный тип, эта переменная должна инициализироваться конструкцией var. Это объясняется тем, что доступ к базовому имени анонимного типа имеет только компилятор. Дополнительные сведения о var см. в разделе Неявно типизированные локальные переменные.