Я проверял атрибут 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).
http://tinyurl.com/zplbt7m –
Атрибуты обычно ничего не делают сами по себе для типа. Так же, как 'DefaultValue' не предоставляет или не применяет значение по умолчанию, а' Range' не применяет диапазон, они являются метаданными и вообще для чего-то еще, чтобы читать и действовать. И строки неизменны. 'myString (x) =" x "c' не работает. – Plutonix
Строка неизменна, если ее видно с нашей стороны, но она не является неизменной вообще, поскольку она имеет внутренний метод, который StringBuilder использует для изменения состояния строки (не для назначения новой строки). Спасибо за комментарий! – ElektroStudios