日期:2014-05-17  浏览次数:21012 次

为什么匿名类的属性不让修改
例如:

var v = new { Index = 10, Name = "abc" };
            v.Index = 2;//error CS0200: Property or indexer 'AnonymousType#1.Index' cannot be assigned to -- it is read only

问题: 如果C#的匿名类设计的初衷是让我们不需要为简单的类型设置命名,那为什么属性都是只读的(get),而不能修改或者重新赋值呢? 如果可以set,会带来什么语义上的风险或者问题吗?

------解决方案--------------------
不是很理解微软团队的意图,但是设计只读类,有这么几个好处,供你参考:
(1)值的原子性,不存在更改了某个属性而没有更改关联的某个属性造成的非原子状态。比如对于DateTime,月和日就需要原子修改,否则可能出现2月31日这种非法的日期,对于地址,国家、城市、街道是关联的,否则会出现日本湖南省这种奇怪的地址。原子性对于多线程以及出现异常的时候特别重要。
(2)HashCode和排序的稳定性(所谓稳定性是指,对于表示相同大小的两个元素,排序前后相对位置不变),对于GroupBy OrderBy,如果设计可以更改属性的对象,那么保持排序稳定就需要额外的跟踪了。
(3)不鼓励匿名类型的滥用,微软希望匿名类型只用于Linq的Select等特定目的,而不要在更多场合使用。
------解决方案--------------------
匿名类是用来给select查询结果提供简单直观的实现的,说它是为了“让我们不需要为简单的类型设置命名”这个可能有点点过头。