Подтвердить что ты не робот

Зачем мне "поле:" в объявлении атрибута "[field: NonSerialized]"?

Я не могу найти поле, указанное в качестве ключевого слова С# в любом месте. Кто-нибудь знает предысторию этого?

4b9b3361

Ответ 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;