- •Основы c#. Урок 1. Что такое c#?
- •Основы c#. Урок 2. Что такое net Runtime?
- •Основы c#. Урок 3. Первая программа на c#
- •Основы c#. Урок 4. Переменные языка c#
- •Основы c#. Урок 5. Логические операторы
- •Основы c#. Урок 6. Массивы в c#
- •Основы c#. Урок 7. Операторы if и switch
- •Основы c#. Урок 8. Циклы for и foreach
- •Основы c#. Урок 9. Цикл while
- •Основы c#. Урок 10. Классы в c#
- •Основы c#. Урок 11. Конструкторы классов
- •Основы c#. Урок 12. Наследование
- •Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного
- •Основы c#. Урок 14. Вложенные классы
- •Основы c#. Урок 15. Перегрузка бинарных операторов
- •Основы c#. Урок 16. Перегрузка унарных операторов
- •Основы c#. Урок 17. Область видимости
- •Основы c#. Урок 18. Виртуальные функции
- •Основы c#. Урок 19. Абстрактные классы
- •Основы c#. Урок 20. Запрещение наследования или модификатор sealed
- •Основы c#. Урок 21. Статические переменные
- •Основы c#. Урок 22. Статические методы класса
- •Основы c#. Урок 23. Статические конструкторы
- •Основы c#. Урок 24. Закрытые конструкторы или классы без экземпляров
- •Основы c#. Урок 25. Передача параметров переменой длины
- •Основы c#. Урок 26. Строки (класс System.String)
- •Основы c#. Урок 27. Строки (класс StringBuilder)
- •Основы c#. Урок 28. Передача параметров по ссылке и по значению (ref и out)
- •Основы c#. Урок 29. Пример передачи по ссылке
- •Основы c#. Урок 30. Перегрузка
- •Основы c#. Урок 31. Функции класса System.Array
- •Основы c#. Урок 33. События
- •Основы c#. Урок 35. Введение в атрибуты
- •Основы c#. Урок 36. Пример пользовательского атрибута.
- •Основы c#. Урок 37. Параметры командной строки
- •Основы c#. Урок 38. Метод Main в отдельном классе
- •Основы c#. Урок 39. Форматированный вывод
- •Основы c#. Урок 40. Класс System.Object
- •Основы c#. Урок 41. Методы класса System.Object
- •Основы c#. Урок 42. Переопределяем методы класса System.Object
- •Основы c#. Урок 43. Константы
- •Основы c#. Урок 44. Модификаторы доступа
- •Основы c#. Урок 45. Ссылка на текущий экземпляр класса (this)
- •Основы c#. Урок 47. Работаем со специальными папками
- •Основы c#. Урок 48. Получаем список всех дисков
- •Основы c#. Урок 49. Ввод/вывод в c# (System.Io)
- •Основы c#. Урок 50. Классы для работы с папками и файлами
- •Основы c#. Урок 51. Класс Directory
- •Основы c# Урок 52. Класс File
- •Основы c# Урок 53. Класс FileSystemInfo
- •Основы c# Урок 54. Класс DirectoryInfo
- •Основы c# Урок 55. Перечисление FileAttributes
- •Основы c# Урок 56. Класс FileInfo
- •Основы c# Урок 57. Пример: получение имен всех подпапок
Основы c#. Урок 35. Введение в атрибуты
Сначала несколько слов о том, что такое атрибуты. Итак, атрибут - это некоторая дополнительная информация, которая может быть приписана к типам, полям, методам, свйствам и некотрым другим конструкциям языка. Атрибуты поещаются в исполняемый файл и могут оттуда при необходимости извлекаться.
Все атрибуты (в отличие, скажем, от атрибутов языка IDL) являются классами (потомками класса System.Attribute). В отличие от атрибутов IDL набор атрибутов .NET открыт для дополнения, т. е. вы можете определять собственные атрибуты и применять их к вышеуказанным элементам вашего кода.
Атрибуты делятся на предопределенные (встроенные) и пользовательские (которые пишет программист).
Встроенные атрибуты могут использоваться, например, при сериализации (сохранении в поток) данных класса. Скажем, вам надо, чтобы у класса сохранялись не все данные - в этом случае вы можете пометить те данные, которые не надо сохранять, специальным атрибутом.
Еще пример применения атрибутов. Компоненты, которые вы располагаете на форме (кнопки, метки и т. п.) имеют некоторый набор свойств (шрифт, местоположение, видимость и т. п.). В IDE Visual Studio вы можете выбрать в окне Properties один из двух способов расположения этих свойств - по алфавиту или по категориям. Так вот, в какую категорию попадет то или иное свойство, определяется специальным встроенным атрибутом.
Атрибуты в C# заключаются в квадратные скобки.
Основы c#. Урок 36. Пример пользовательского атрибута.
Вот пример определения и использования пользовательского атрибута:
usingSystem;
namespacetest
{
//Объявление атрибута.
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
class TestAttribute: System.Attribute
{
//Поле атрибута.
private string name;
//Конструктор атрибута.
public TestAttribute(string name)
{
this.name = name;
}
//Свойство только для чтения.
public virtual string Name
{
get
{
return name;
}
}
}
//Конец объявления атрибута.
//Применение атрибута к классу.
[TestAttribute("Igor Alexeev")]
class Test
{
static void Main()
{
GetAttribute(typeof(Test));
}
public static void GetAttribute(Type t)
{
TestAttribute att=
(TestAttribute) Attribute.GetCustomAttribute(t, typeof(TestAttribute));
Console.WriteLine("{0}", att.Name);
}
}
}
Как видно, атрибут TestAttribute является потомком класса System.Attribute (как всегда). Перед определением нового атрибута мы видим строку
...
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
...
Этой строкой определяется область применения нашего атрибута - первый параметр (AttributeTargets.All) говорит о том, что мы сможем применять наш атрибут TestAttribute к чему угодно, второй (Inherited=false) - что атрибут не будет наследоваться (т. е. если мы применим атрибут TestAttribute к некоторому классу, то у потомков этого класса атрибута TestAttribute не будет), третий (AllowMultiple = true) - что атрибут к каждому элементу может пременяться только один раз (заметим в скобках, что для определения области применения нашего пользовательского атрибута мы используем другой атрибут - AttributeUsage).
Далее мы определяем для нашего атрибута внутреннюю переменную name типа string и конструктор с параметром типа string. В конструкторе мы записываем значение в переменную name. Еще чуть ниже мы пишем в классе атрибута свойство только для чтения:
...
public virtual string Name
{
get
{
return name;
}
}
...
После создания класса атрибута мы применяем его к другому классу Test. Для этого мы должны создать экземпляр атрибута TestAttribute непосредственно перед классом Test:
...
[TestAttribute("Igor Alexeev")]
classTest
{
...
Делаем мы это в квадратных скобках. При этом у нас вызывается конструктор с параметром атрибута.
В классе Test мы в методе GetAttribute просто выводим на консоль значение свойства name атрибута. Для этого мы воспользовались статическим методом GetCustomAttribute класса Attribute. Этот метод принимает в качестве параметров тип, к которому атрибут применяется (т. е. класс Test в нашем случае) и собственно атрибут, который мы применяем (у нас это TestAttribute). Возвращает же он экземпляр атрибута, который мы и используем для получения значения свойства name.
Метод GetAttribute мы вызываем в констукторе класса Test.
Результатом выполнения нашей программы будет вывод на консоль слов "Igor Alexeev".