修改匿名类型的字段?

时间:2009-04-22 19:14:58

标签: c# .net

在这个例子中:

var p1 = new {Name = "A", Price = 3};

这转化为IL:

class __Anonymous1
{
   private string name ;
   private int price;
   public string Name{ get { return name; } set { name = value ; } }
   public int Price{ get { return price; } set { price= value ; } }
}
__Anonymous1 p1 = new __Anonymous1();
p1.Name = "A";
pt.Price =3

根据IL,它是允许,为什么会这样?它背后的决定是什么?不应该只读?

由于

这是我的第一个问题,温柔。

6 个答案:

答案 0 :(得分:5)

让我转过来谈谈你:为什么要限制它?

答案 1 :(得分:2)

编译器生成类并在编译源时为它们命名。这些类具有读/写属性的原因是(如IL所示)编译器不会创建具有所有必需属性的构造函数,因此必须对属性进行读/写以允许设置值。这也允许几个匿名类型使用相同的类,只要它们的属性相同。

答案 2 :(得分:1)

如果我列出了匿名类型,例如,当使用LINQ时,您可能希望在获得其余信息后更改属性的值。

例如,如果您的匿名类型中有一个百分比字段,则在知道最大值或总数(取决于您希望如何定义百分比)之前,您可能无法计算该字段。

答案 3 :(得分:1)

我认为匿名类型不可变的原因是函数语言对LINQ和C#3.0的影响以及它们是一个非常具体问题的解决方案。

如果要修改字段(属性),只需创建自己的类而不是使用匿名类。是否存在必须使用匿名类能够修改属性的情况?

答案 4 :(得分:0)

这是编译器的实现细节,不应该依赖它。未来的编译器可以完全自由地使匿名类型获取构造函数参数并使所有属性都是get-only。对于所有意图和目的,匿名类型对象一旦被实例化就应该被认为是不可变的。 (但是,属性本身可能会引用可变对象。)

答案 5 :(得分:-2)

我不确定我理解你的问题......为什么不允许这样做?......或者你不希望被允许做什么?

var p = new {Name = "A", Price = 3};
//Some Code Here
p.Name = "B";
//Some more code 
p.Price = 5;

同样,如果我要创建第二个匿名变量,C#编译器足够聪明,知道它们具有相同的结构,因此它将在后台生成一个匿名类。

var p = new {Name = "A", Price = 3};

//Some Time Later

var q = new {Name = "B", Price = 4};

//Only one anonymous class is generated in the IL