Применение встроенных атрибутов C#
Применение встроенных атрибутов C#
Как упоминалось выше, библиотека базовых классов .NET предлагает целый ряд атрибутов из разных пространств имен. В табл. 12.3 приводится короткий список некоторых из таких атрибутов (и, конечно же, далеко не всех).
Чтобы привести пример применения атрибутов в C#, предположим, что нам нужно построить класс Motorcycle (мотоцикл), допускающий сериализацию в двоичном формате. Для этого мы должны просто добавить атрибут [Serializable] в определение класса. Если при этом какое-то поле при сериализации сохраняться не должно, то к нему можно применить атрибут [NonSerialized].
// Этот класс можно сохранить на диске.
[Serializable]
public class Motorcycle {
// Но это поле сохраняться не должно.
[NonSerialized]
float weightOfCurrentPassengers;
// Следующие поля сохраняются.
bool hasRadioSystem;
bool hasHeadSet;
bool hasSissyBar;
}
Таблица 12.3. Малая часть встроенных атрибутов
Атрибут Описание [CLSCompliant] Требует от элемента строгого соответствия правилам CLS (Common Language Specification – общеязыковые спецификации). Напомним, что соответствующие CLS-спецификациям типы гарантированно могут использоваться во всех языках программирования .NET [DllImport] Позволяет программному коду .NET вызывать библиотеки программного кода C или C++ (которые не являются управляемыми), включая API (Application Programming Interface – программный интерфейс приложения) операционной системы. Заметьте, что [DllImport] не используется при взаимодействии с программным обеспечением COM [Obsolete] Обозначает устаревший тип или член. При попытке использовать такой элемент программист получит предупреждение компилятора с соответствующим описанием ошибки [Serializable] Обозначает возможность сериализации класса или структуры [NonSerialized] Указывает, что данное поле класса или структуры не должно сохраняться в процессе сериализации [WebMethod] Обозначает доступность метода для вызова через запросы HTTP и требует от среды CLR сохранения возвращаемого значения метода в формате XML (подробности можно найти в главе 25)Замечание. Указанный атрибут применяется только к элементу, непосредственно следующему за атрибутом. Например, единственным не сохраняемым полем класса Motorcycle будет weightOfCurrentPassengers. Остальные поля при сериализации сохраняются, поскольку весь класс аннотирован атрибутом [Serializable].
Пока что не беспокойтесь о сути самого процесса сериализации объекта (подробности этого процесса будут рассмотрены в главе 17). Обратите внимание только на то, что при использовании атрибута его имя должно заключаться в квадратные скобки.
После компиляции этого класса можете проверить его метаданные с помощью ildasm.exe. Соответствующие атрибуты будут обозначены метками serializable и notserialized (рис. 12.6).
Как вы можете догадаться сами, один элемент может иметь много атрибутов. Предположим, что у нас есть тип класса C# (HorseAndBuggy), обозначенный как serializable, но теперь он считается устаревшим.
Рис. 12.6. Отображение атрибутов в окне ildasm.exe
Чтобы применить множество атрибутов к одному элементу, используйте список значений, разделенных запятыми.
[Serializable,
Obsolete("Класс устарел, используйте другой транспорт!")]
public class HorseAndBuggy {
// …
}
В качестве альтернативы, чтобы применить несколько атрибутов к одному элементу, можно просто указать их по порядку (результат будет тем же).
[Serializable]
[Obsolete("Класс устарел, используйте другой транспорт!")]
public class HorseAndBuggy {
// …
}