Анонимный тип - это тип, сгенерированный компилятором из-за выражения, такого как:
new { Property1 = x.Value1, Property2 = y.Value2, z.Value3 }
(последний как Value3 = z.Value3
).
Имя анонимного типа "невыразимо" - то есть вы не можете указать его в обычном C # - но это совершенно нормальный тип для CLR. Поскольку вы не можете написать имя, если вы хотите создать переменную анонимного типа (или универсального типа, использующего анонимный тип в качестве аргумента типа), вам необходимо использовать неявно типизированную локальную переменную с ключевым словом var
:
var person = new { Name = "Bill", Address = "..." };
C # анонимные типы являются неизменяемыми (то есть свойства доступны только для чтения) - сгенерированный тип имеет один конструктор, который принимает значения для всех свойств в качестве параметров. Типы свойств выводятся из значений.
Анонимные типы переопределяют GetHashCode
, Equals
и ToString
достаточно очевидными способами - для хеширования и равенства используется компаратор по умолчанию для каждого типа свойств.
Они обычно используются в LINQ таким же образом, как если бы вы использовали «SELECT Value1 As Property1, Value2 As Property2, Value3» в SQL.
Каждое выражение инициализатора анонимного типа, которое использует одинаковые имена свойств и типы в одном и том же порядке, будет ссылаться на один и тот же тип, поэтому вы можете написать:
var x = new { Name = "Fred", Age = 10 };
x = new { Name = "Bill", Age = 15 };
Также стоит знать, что анонимные типы VB немного отличаются: по умолчанию они изменчивы. Вы можете сделать каждое отдельное свойство неизменным, используя ключевое слово «Key». Лично я предпочитаю способ C #, но я вижу, что изменчивость может быть полезна в некоторых ситуациях.