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

Обновлен: Июль 2008

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

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

Анонимные типы обычно используются в предложении select выражения запроса для возврата подмножества свойств из каждого объекта в исходной последовательности. Дополнительные сведения о запросах см. в разделе Выражения запросов LINQ (Руководство по программированию в C#).

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

Анонимные типы — это типы 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);
}

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

Заметки

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

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

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

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

Поскольку методы Equals и GetHashCode анонимных типов определены через Equals и GetHashcode свойств, два экземпляра одного анонимного типа будут идентичны только тогда, когда идентичны все их свойства.

См. также

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

Руководство по программированию в C#

Выражения запросов LINQ (Руководство по программированию в C#)

Ссылки

Инициализаторы объектов и коллекций (Руководство по программированию в C#)

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

Приступая к работе с LINQ в C#

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

В текст приветствия и в раздел примечаний добавлены сведения об ограничениях приведения.

Улучшение информации.