"ImmutableObject"属性有什么好处?

5
我只是出于好奇测试了 ImmutableObjectAttribute 属性,想看看是否能从中获得一些好处或者它只是语义修饰...

指定对象没有可被编辑的子属性。

所以我有这个类:

<ImmutableObject(True)>
Public Class TestClass

    <ImmutableObject(True)>
    Public sb As StringBuilder

    Public Sub New()
        sb = New StringBuilder
    End Sub

End Class

我已经使用以下代码进行测试:

    Dim obj As New TestClass

    obj.sb.Append("Hello")
    obj.sb.Append(" ")
    obj.sb.Append("World")

    MsgBox(obj.sb.ToString)

然后,当我在可变对象中应用了ImmutableObject属性之后,我预期会看到某种编译器警告、运行时异常或者只是从StringBuilder的内部字符串接收到意外值,但是没有发生任何事情,一切似乎都正常工作。
这让我想到一个问题,答案似乎很显然,但我需要问一下:
  • ImmutableObject属性只是一种装饰性属性吗?
那么为什么存在这个属性呢?如果不确保成员真正不可变,或者至少是.Net理解的不可变(你知道,在.Net中,像String并不是真正的不可变),我无法找到任何好处标记一个类使用这个属性。

http://tinyurl.com/zplbt7m - Matthew Whited
2
属性本身通常不会对类型产生任何影响。就像 DefaultValue 不提供或强制执行默认值,Range 不强制执行范围一样,它们是元数据,通常由其他东西来读取和处理。另外,字符串是不可变的。myString(x) = "x"c 是行不通的。 - Ňɏssa Pøngjǣrdenlarp
一个字符串在我们这边看来是不可变的,但实际上它并不是完全不可变的,因为它有一个内部方法,StringBuilder使用该方法来改变字符串的状态(而不是分配一个新的字符串)。感谢您的评论! - ElektroStudios
1个回答

11

来自ImmutableObjectAttribute类文档:

此属性通常在属性窗口中用于确定是否将可展开对象呈现为只读。因此,此属性仅在设计时使用。

...所以是为了装饰而存在的。


MSDN上的那些该死的注释部分...我讨厌忘记阅读它们,呵呵。谢谢! - ElektroStudios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接