Зачем мне нужно “поле:” в моем объявлении атрибута “[поле: несериализованное]”?

StackOverflow https://stackoverflow.com/questions/2022035

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top