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

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

Анонимные типы создаются с помощью нового оператора и инициализатора объекта. Дополнительные сведения об инициализаторах объекта см. в разделе Инициализаторы объектов и коллекций (Руководство по программированию в 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#