Как используется ImmutableObjectAttribute?

Я искал встроенный атрибут, чтобы указать, что тип является неизменным, и я нашел только System.ComponentModel.ImmutableObjectAttribute.

Используя Reflector, я проверил, где он использовался, и кажется, что единственный открытый класс, который использует его, это System.Drawing.Image... WTF? Он мог бы использоваться для string, int или любого из примитивных типов, но Image определенно не является неизменным, есть много способов изменить его внутреннее состояние (например, с помощью метода Graphics или Bitmap.SetPixel).

Таким образом, единственный класс в BCL, который явно объявлен как неизменяемый, является изменяемым! Или я что-то упустил?

Ответ 1

В документации указано:

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

Отражатель показывает, что единственным методом, использующим этот атрибут, является внутренний атрибут свойства System.Windows.Forms.PropertyGridInternal.GridEntry.Flags, используемый сетками свойств проекта.

Ответ 2

Я думаю, что вы перепутали использование ImmutableObjectAttribute - это означает, что свойства объекта не должны редактироваться в конструкторе форм или аналогичном пользовательском интерфейсе во время разработки, а не то, что сам объект является неизменным.

Этот атрибут, вероятно, является кандидатом на Daily WTF, однако...

Ответ 3

Посмотрите документацию для ImmutableObjectAttribute: "Указывает, что объект не имеет подпроцессов, которые могут быть отредактированы... Этот атрибут обычно используется в окне" Свойства ", чтобы определить, следует ли визуализировать расширяемый объект как доступный только для чтения. это свойство используется только во время разработки". Таким образом, этот атрибут не имеет отношения к неизменяемости: он отключает отображение/редактируемость подпроцессов в редакторе, таком как PropertyGrid.

Таким образом, изображение не объявляется неизменным, а не Int32 как изменчивое. Int32 не нуждается в атрибуте ImmutableObjectAttribute, потому что он не расширяется в любом случае. У него есть изображение, потому что оно будет расширяемым, но не полезно. Это просто действительно, действительно вводящее в заблуждение имя.