如何使用ImmutableObjectAttribute?

时间:2009-11-06 23:34:58

标签: .net immutability

我正在寻找一个内置属性来指定一个类型是不可变的,而我只找到了 System.ComponentModel.ImmutableObjectAttribute

使用Reflector,我检查了它的使用位置,似乎唯一使用它的公共类是System.Drawing.Image ... WTF?它可以用在string,int或任何基本类型上,但Image绝对不是不可变的,有很多方法可以改变它的内部状态(使用Graphics或Bitmap.SetPixel方法)例如)。

因此,BCL中唯一一个显式声明为不可变的类,可变的!或者我错过了什么?

3 个答案:

答案 0 :(得分:10)

文档说明:

  

此属性通常用于   要确定的“属性”窗口   是否呈现可扩展对象   只读。就这样,这个属性   仅在设计时使用。

Reflector显示使用此属性的唯一方法是设计属性网格使用的内部System.Windows.Forms.PropertyGridInternal.GridEntry.Flags属性getter。

答案 1 :(得分:5)

我认为您对ImmutableObjectAttribute的使用感到困惑 - 这意味着对象的属性不应该在表单设计器或类似的设计时UI中编辑, not 该对象本身是不可变的。

这个属性可能是每日WTF的候选人,但是......

答案 2 :(得分:3)

查看ImmutableObjectAttribute的文档:“指定对象没有能够编辑的子属性...此属性通常在”属性“窗口中用于确定是否将可扩展对象呈现为只读。因此,此属性仅在设计时使用。“所以这个属性并不是真正的不变性:它是关于在像PropertyGrid这样的编辑器中禁用子属性的显示/可编辑性。

因此,Image不会被声明为不可变的,而不是Int32可变的。 Int32不需要ImmutableObjectAttribute,因为它无论如何都不可扩展。图像有它,因为它可以扩展,但没有用。这只是一个非常非常误导的名字。