2016-01-06 2 views
2

Я проверял атрибут ImmutableObjectAttribute только для любопытства, чтобы увидеть, если я мог бы получить некоторые beneffits его применения, или если это было только для смыслового украшения ...Какое преимущество предоставляет атрибут ImmutableObject?

Указывает, что объект не имеет подпроцессов, которые могут быть отредактированы.

Так у меня есть этот класс:

<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 просто декоративный атрибут ?.

Почему этот атрибут тогда? Я не могу найти какой-либо beneffit, обозначающий класс с этим атрибутом, он не гарантирует, что члены действительно неизменяемы или, по крайней мере, что .Net понимает для неизменяемого (вы знаете, как String на самом деле не является неизменным в .Net).

+0

http://tinyurl.com/zplbt7m –

+2

Атрибуты обычно ничего не делают сами по себе для типа. Так же, как 'DefaultValue' не предоставляет или не применяет значение по умолчанию, а' Range' не применяет диапазон, они являются метаданными и вообще для чего-то еще, чтобы читать и действовать. И строки неизменны. 'myString (x) =" x "c' не работает. – Plutonix

+0

Строка неизменна, если ее видно с нашей стороны, но она не является неизменной вообще, поскольку она имеет внутренний метод, который StringBuilder использует для изменения состояния строки (не для назначения новой строки). Спасибо за комментарий! – ElektroStudios

ответ

6

Из документации ImmutableObjectAttribute Class:

Этот атрибут обычно используется в окне свойств, чтобы определить, является ли оказывать расширяемый объект как только для чтения. Таким образом, это свойство используется только во время разработки.

... так что да, это только для украшения.

+0

Проклятые разделы замечаний от MSDN ... Я ненавижу забывать их читать, хе-хе. Спасибо! – ElektroStudios

Смежные вопросы