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

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

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

В следующем примере показан анонимный тип, который инициализируется двумя свойствами Amount и Message.

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

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

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

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

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

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

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#).

Массив анонимно типизированных элементов можно создать путем объединения неявно типизированной локальной переменной и неявно типизированного массива, как показано в следующем примере.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

Заметки

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

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

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

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

См. также

Ссылки

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

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

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

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

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

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

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

Дата

Журнал

Причина

Апрель 2011

Текст уточнен.

Обратная связь от клиента.