Анонимные типы в С#

// 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, поэтому разработчики языка решили пойти с неизменными анонимными типами.

Ответ 3

Интересное выражение из здесь. И альтернатива найдена здесь.

... [B], гарантируя, что члены не меняются, мы гарантируем, что hash является постоянным для времени жизни объекта. Это позволяет анонимно типы, которые будут использоваться с коллекциями, такими как hashtables, без теряя их при изменении членов. Есть много преимуществ непреложности в этом, он значительно упрощает код, который использует объект, поскольку им могут присваиваться только значения при создании и затем просто используется (подумайте о потоке)