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