我正在寻找一个内置属性来指定一个类型是不可变的,而我只找到了 System.ComponentModel.ImmutableObjectAttribute
使用Reflector,我检查了它的使用位置,似乎唯一使用它的公共类是System.Drawing.Image ... WTF?它可以用在string,int或任何基本类型上,但Image绝对不是不不可变的,有很多方法可以改变它的内部状态(使用Graphics或Bitmap.SetPixel方法)例如)。
因此,BCL中唯一一个显式声明为不可变的类,是可变的!或者我错过了什么?
答案 0 :(得分:10)
文档说明:
此属性通常用于 要确定的“属性”窗口 是否呈现可扩展对象 只读。就这样,这个属性 仅在设计时使用。
Reflector显示使用此属性的唯一方法是设计属性网格使用的内部System.Windows.Forms.PropertyGridInternal.GridEntry.Flags
属性getter。
答案 1 :(得分:5)
我认为您对ImmutableObjectAttribute
的使用感到困惑 - 这意味着对象的属性不应该在表单设计器或类似的设计时UI中编辑, not 该对象本身是不可变的。
这个属性可能是每日WTF的候选人,但是......
答案 2 :(得分:3)
查看ImmutableObjectAttribute的文档:“指定对象没有能够编辑的子属性...此属性通常在”属性“窗口中用于确定是否将可扩展对象呈现为只读。因此,此属性仅在设计时使用。“所以这个属性并不是真正的不变性:它是关于在像PropertyGrid这样的编辑器中禁用子属性的显示/可编辑性。
因此,Image不会被声明为不可变的,而不是Int32可变的。 Int32不需要ImmutableObjectAttribute,因为它无论如何都不可扩展。图像有它,因为它可以扩展,但没有用。这只是一个非常非常误导的名字。