11
// 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创建的对象的属性是只读的。我想弄清楚为什么这些属性是只读的。建议表示赞赏?

编辑:

var ano1 = new { x1 = 10, y1 = "Hello" };

var ano2 = new { x1 = 10, y1 = "Hello" };

如果新的匿名类型以相同的顺序具有相同数量和类型的属性,它是否与第一个具有相同的内部类型?

4

3 回答 3

14

var不是“使用匿名类型”,而是“编译器,帮我弄清楚类型!”。在前三种情况下,类型实际上是“命名”类型 - System.Int32, System.String, 和System.Int32[](在最后一种情况下,数组元素的类型也由编译器从您放入初始化程序中的数组元素类型推导出来)。

最后一种情况是唯一使用匿名类型的情况。根据设计,C# 的匿名类型是不可变的。首先在语言中添加它们的主要案例是引入 LINQ,它在生成匿名类型的情况下不需要可变性。一般来说,不可变类往往会给设计者带来更少的问题,尤其是在涉及并发时,因此语言的设计者决定使用不可变匿名类型。

于 2013-09-15T18:58:10.350 回答
1

匿名类型是immutable,即不能改变。

什么是不可变类型?

埃里克·利珀特的博客

于 2013-09-15T18:59:07.637 回答
1

来自这里的有趣声明。在这里找到了一个替代方案。

... [B] 确保成员不变,我们确保散列在对象的生命周期内保持不变。这允许匿名类型与散列表之类的集合一起使用,而不会在修改成员时实际丢失它们. 不变性有很多好处,它极大地简化了使用对象的代码,因为它们只能在创建时被赋值,然后才被使用(想想线程)

于 2013-09-15T19:02:36.577 回答