Я не могу найти поле, указанное в качестве ключевого слова С# в любом месте. Кто-нибудь знает предысторию этого?
Зачем мне "поле:" в объявлении атрибута "[field: NonSerialized]"?
Ответ 1
Компилятор С# обычно не имеет проблем с выяснением, в какой части декларации применяется атрибут. Я могу подумать о трех случаях, когда вы можете использовать его:
- Атрибуты, которые применяются к сборке. Очень заметно в AssemblyInfo.cs
- Атрибут, применяемый к возвращаемому значению объявления P/Invoke, [return: MarshalAs]
- Наличие атрибута применимо к резервной переменной свойства или события без аксессуаров. Ваш случай.
Ответ 2
Это необходимо, например, если вы отмечаете событие как несериализуемое. Он указывает цель, к которой относится атрибут.
Это часть синтаксиса целевого атрибута. Из спецификация:
attribute-target:
field
event
method
param
property
return
type
См. также документацию для NonSerializedAttribute
:
Чтобы применить класс
NonSerializedAttribute
к событию, установите поле атрибута в поле, как показано на следующем С# -коде.
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
Ответ 3
Это означает, что вы можете установить атрибут NonSerialized в полях, это полезно для сериализации событий.
Например, это даст вам ошибку компиляции
[NonSerialized]
public event SomeEventHandler SomeEvent;
Чтобы исправить это, вы должны использовать field:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
Подробнее об этом здесь - Делегаты и Сериализация
Ответ 4
NonSerializedAttribute применим только к полям, вы можете использовать его следующим образом:
[NonSerialized]
public string myString;