- •Атрибуты в среде .Net и языке c#.
- •Метаданные
- •Понятие атрибутов
- •Предопределенные и собственные атрибуты
- •Потребители атрибутов
- •Применение атрибутов
- •Сокращенное именование атрибутов
- •Создание собственных атрибутов:
- •Применение собственных атрибутов:
- •Ограничение использования атрибутов:
- •Атрибуты уровня сборки и модуля:
- •Рефлексия атрибутов:
- •Выводы:
- •Язык xml. Классы платформы .Net для работы с xml-данными.
- •Синтаксис xml
- •Работа с xml при помощи System.Xml
- •Работа с xml при помощи linq to xml
- •Выводы:
- •Потоковый ввод-вывод. Файлы. Работа с файлами и каталогами. Пространство имен System.Io
- •Классы Directory (DirectoryInfo) и File (FileInfo) Некоторые общие свойства классов DirectoryInfo и FileInfo:
- •Дополнительные возможности класса DirectoryInfo
- •Дополнительные возможности класса FileInfo
- •Дополнительные члены File
- •Потоковый ввод-вывод
- •Работа с классом FileStream
- •Работа с классами StreamWriter и StreamReader
- •Классы StringWriter и StringReader
- •Работа с классами BinaryWriter и BinaryReader
- •Выводы:
- •Сериализация. Атрибуты. Стандартные форматы сериализации. Понятие сериализации объектов
- •Роль графов объектов
- •Конфигурирование объектов для сериализации
- •Общедоступные поля, приватные поля и общедоступные свойства
- •Стандартные форматеры сериализации
- •Настройка сериализации с использованием атрибутов
- •Выводы:
- •Понятие бд и субд. Язык sql. Ado.Net как средство доступа из c# к субд. Понятие бд
- •Понятие субд
- •Обзор синтаксиса
- •Подключенный уровень
- •Автономный уровень
- •Основные свойства класса DataSet
- •Основные методы класса DataSet
- •Типы DataColumn и DataRow
- •Основные члены типа DataColumn:
- •Основные члены типа DataRow:
- •Работа с адаптерами данных:
- •Основные члены класса DbDataAdapter:
- •Параллельные вычисления. Многозадачность и многопоточность.
- •Некоторые члены класс Process:
- •Некоторые члены класса ProcessThread
- •Домены приложений
- •Некоторые члены класс AppDomain:
- •Многопоточность. Классификация состояний потока. Средства многопоточного программирования System.Threading.
- •Некоторые члены пространства имен System.Threading
- •Основные члены класс Thread
- •Состояния потока
- •Многопоточное программирование при помощи асинхронных вызовов делегатов
- •Создание вторичных потоков при помощи Thread.Start()
- •Синхронизация с помощью lock
- •Синхронизация с использованием типа System.Threading.Monitor
- •Синхронизация с использованием типа System.Threading.Interlocked
- •Синхронизация с использованием атрибута [Synchronization]
- •Использование System.Threading.Timer
- •Пул потоков clr
- •Библиотека Windows.Forms. Пространства имен. Структура приложения. Элементы управления. События. Иерархия элементов управления.
- •Основные пространства имен Windows Forms
- •Структура приложения WinForms
- •Элементы управления
- •События
- •Библиотека wpf. Отличия wpf от WindowsForms. Разметка xaml. Понятие Windows Presentation Foundation
- •Типы приложений wpf
- •Основные сборки wpf
- •Построение приложения wpf без xaml
- •Построение приложения wpf с использованием только xaml
- •Пример c# обработчика события для контрола, объявленного в xaml (связь кода и xaml):
- •Создание проекта
- •Знакомство с инструментами визуального конструктора wpf
Потребители атрибутов
Важно понимать, что при применении атрибутов в коде размещающиеся внутри них метаданные, по сути, остаются бесполезными до тех пор, пока не запрашиваются явным образом в каком-то другом компоненте программного обеспечения посредством рефлексии. Если этого не происходит, они спокойно игнорируются и не причиняют никакого вреда.
Атрибуты могут использовать:
Компилятор. Например, встретив атрибут [Obsolete], компилятор отобразит соответствующее предупреждение в окне Error List.
Библиотечные классы. К примеру, метод Serialize() класса BinaryFormatter определит класс, отмеченный атрибутом [Serializable], как подлежащий сохранению в двоичном виде.
Среда CLR. Например, чтобы можно было получать доступ к методу посредством HTTP-запросов, а его возвращаемое значение автоматически преобразовывалось в формат XML, понадобится применить к этому методу атрибут [WebMethod], а обо всех остальных деталях будет заботиться CLR-среда.
Специальные утилиты, помогающие при разработке, отладке, исследовании программ.
И, разумеется, можно создавать собственные приложения, способные распознавать наличие атрибутов и так или иначе использовать эту информацию.
Применение атрибутов
Рассмотрим применение атрибутов на примере сериализации. Предположим, требуется создать класс Point, который можно было бы сохранять в двоичном формате. Для этого достаточно применить к определению этого класса атрибут [Serializable]. Если в классе есть какое-то поле, которое не должно сохраняться, к нему должен быть применен атрибут [NonSerialized].
// Этот класс может сохраняться на диске
[Serializable]
class Point : Shape
{
// Это поле сохраняться не будет
[NonSerialized]
uint _color;
double _x;
double _y;
}
Действие атрибута распространяется только на элемент сразу же после него, поэтому, например, [NonSerialized] будет действовать только на _color.
К одному элементу можно применять сразу несколько атрибутов. При этом равноценными будут записи
[NonSerialized]
[Obsolete("Do not use this field")]
uint _color;
и
[NonSerialized, Obsolete("Do not use this field")]
uint _color;
Сокращенное именование атрибутов
На самом деле по соглашению атрибуты имеют суффикс Attribute, но его можно опускать при использовании в коде. Поэтому в действительности класс, реализующий атрибут [NonSerialized] , имеет имя NonSerializedAttribute, и равноценными будут записи
[NonSerialized]
uint _color;
и
[NonSerializedAttribute]
uint _color;
Создание собственных атрибутов:
Пример:
class ShapeDescriptionAttribute: System.Attribute
{
// свойство
public string Description { get; set; }
// конструкторы
public ShapeDescriptionAttribute() { }
public ShapeDescriptionAttribute(string description)
{
Description = description;
}
}
Как видно, атрибут – обычный класс, только унаследованный от System.Attribute.
Применение собственных атрибутов:
Пример:
[ShapeDescription("Точка на плоскости")]
class Point : Shape
{
double _x;
double _y;
};
[ShapeDescription(Description = "Окружность на плоскости")]
class Circle : Shape
{
Point _center;
double _radius;
}
В первом случае используется инициализация через конструктор атрибута, во втором —так называемый синтаксис именованных атрибутов. Для него нужно, чтобы в классе атрибута были доступные для записи свойства (как, например Description).