Анонимные типы в С#
// x is compiled as an int
var x = 10;
// y is compiled as a string
var y = "Hello";
// z is compiled as int[]
var z = new[] { 0, 1, 2 };
но
// ano is compiled as an anonymous type
var ano = new { x1 = 10, y1 = "Hello" };
ano
Созданные свойства объекта доступны только для чтения. Я хочу понять, почему эти свойства доступны только для чтения. предложения приветствуются?
EDIT:
var ano1 = new { x1 = 10, y1 = "Hello" };
var ano2 = new { x1 = 10, y1 = "Hello" };
Это, если новый анонимный тип имеет одинаковый номер и тип свойств в том же порядке, будет ли он того же внутреннего типа, что и первый?
Ответы
Ответ 1
var
не означает "использовать анонимный тип", это означает "Компилятор, пойдите, выясните тип для меня!". В первых трех случаях тип на самом деле является "именованным" типом - System.Int32
, System.String
и System.Int32[]
(в последнем случае тип элементов массива также выводится компилятором из типа элементов массива который вы ввели в инициализатор).
Последний случай - единственный, где используется анонимный тип. По замыслу, анонимные типы С# неизменяемы. Первичным случаем для их добавления в язык в первую очередь было введение LINQ, которое не нуждается в изменчивости в случаях, когда создаются анонимные типы. В общем, неизменяемые классы, как правило, придают дизайнерам меньше проблем, особенно когда участвует concurrency, поэтому разработчики языка решили пойти с неизменными анонимными типами.
Ответ 2
Анонимные типы immutable
, i.e Невозможно изменить.
Что такое неизменяемый тип?
Блог Эрика Липперта
Ответ 3
Интересное выражение из здесь. И альтернатива найдена здесь.
... [B], гарантируя, что члены не меняются, мы гарантируем, что hash является постоянным для времени жизни объекта. Это позволяет анонимно типы, которые будут использоваться с коллекциями, такими как hashtables, без теряя их при изменении членов. Есть много преимуществ непреложности в этом, он значительно упрощает код, который использует объект, поскольку им могут присваиваться только значения при создании и затем просто используется (подумайте о потоке)