Зачем мне нужно "field:" в объявлении моего атрибута "[field: NonSerialized]"? - PullRequest
16 голосов
/ 07 января 2010

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

Ответы [ 4 ]

12 голосов
/ 07 января 2010

Это необходимо, например, если вы помечаете событие как не сериализуемое. Он указывает цель, к которой применяется атрибут.

Это часть целевого синтаксиса атрибута. Из спецификации :

attribute-target:
    field
    event
    method
    param
    property
    return
    type

См. Также документацию для NonSerializedAttribute:

Чтобы применить класс NonSerializedAttribute к событию, установите для поля атрибута значение field, как показано в следующем коде C #.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

6 голосов
/ 07 января 2010

Компилятору C # обычно не составляет труда выяснить, к какой части объявления относится атрибут. Я могу вспомнить три случая, когда вы могли бы использовать его:

  1. Атрибуты, которые применяются к сборке. Очень хорошо видно в AssemblyInfo.cs
  2. Атрибут, примененный к возвращаемому значению объявления P / Invoke, [return: MarshalAs]
  3. Наличие атрибута применимо к резервной переменной свойства или события без средств доступа. Ваш случай.
5 голосов
/ 07 января 2010

Это позволяет вам установить атрибут NonSerialized для полей, это полезно при сериализации событий.

Например, это может привести к ошибке компиляции

[NonSerialized]
public event SomeEventHandler SomeEvent;

Чтобы исправить это, вы должны использовать field:

[field:NonSerialized]
public event SomeEventHandler SomeEvent;

Подробнее об этом здесь - Делегаты и сериализация

0 голосов
/ 07 января 2010

NonSerializedAttribute применим только к полям, вы можете использовать его следующим образом:

[NonSerialized]
public string myString;
...