Атрибуты. Красивое слово, не так ли? Что такое атрибуты в C#? Они позволяют добавлять в код описательную информацию, которая может определять действия периода компиляции, периода выполнения, или даже ограничение/предоставление некоторых возможностей какого-либо члена в период выполнения. Атрибуты могут определять информацию, относящуюся к классу, структуре, методу и другим синтаксически-концептуальным элементам. Указываются перед элементом в квадратных скобках, вот таким образом:
using System.Runtime.InteropServices;
..............
..............
[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd,string msg,string caption,int type);
Так импортируются функции из динамических библиотек, хотя в
некоторых книгах, это называется экспортированием. К чему бы это? Этот атрибут, по своей концепции, определяет действия периода выполнения. А сам он определен в пространстве имен System.Runtime.InteropServices.
Можно использовать встроенные атрибуты C#, можно создавать новые. Любой атрибут – это класс, наследованный от класса System.Attribute. Теперь давайте создадим реальный конкретный атрибут, который будет определять, например, адрес URL:
using System;
using Sc=System.Console;
public class URLAttribute:Attribute
{
public URLAttribute(string url)
{
this.URL=url;
}
protected string uRL;
public string URL
{
get{return uRL;}
set{uRL=value;}
}
}
[URLAttribute("www.xakep.ru")]
class HackerLink
{
}
class Application
{
public static void Main()
{
Type type=typeof(HackerLink);
foreach(Attribute attr in type.GetCustomAttributes(false))
{
URLAttribute urlAttr=attr as URLAttribute;
if(null!=urlAttr)
{
Sc.WriteLine("Target Link Is "+urlAttr.URL);
}
}
Sc.ReadLine();
}
}
Из чего же состоит сам атрибут?
1) Защищенная строковая переменная URL, хранящая сам адрес;
2) Свойство URL, управляющее и контактирующее со строковой переменной;
3) Конструктор, устанавливающий адрес, заданный в аргументе.
Далее мы прикрепили созданный атрибут к классу HackerLink, задали ссылку на наш любимый сайтец. Теперь давайте рассмотрим метод Main(). Здесь используется отражение (Reflection). Отражение позволяет динамически определять сведения и данные о типах в проге. В первой строке мы создаем объект типа Type, определяющий тип объекта, при этом используем оператор typeof, который в данном контексте присваивает переменной type значение HackerLink. После этого объект находится в нашем распоряжении. Далее просматриваем все атрибуты, и если какой-то из них удается привести к URLAttribute, то выводим на экран строку с линком. Че-то тут новенькое кажись... А! Оператор as... Так вот...
Оператор as производит попытку приведения типов данных. Попытка может быть как успешной, так и безуспешной.
В этой проге продемонстрирована работа с атрибутами класса. Существуют и другие разновидности атрибутов.
Рассмотрим основные встроенные атрибуты C#.
Атрибут Obsolete служит для того, чтобы отметить фрагмент кода, например метод, как устаревший. Имеет один параметр – строка сообщения, которое выведется при компиляции.
Атрибут Transactionable определяет способность метода участвовать в транзакциях.
Атрибут Conditional служит для создания условных методов, т.е. методов которые выполняются только тогда, когда параметр атрибута является символьной константой, определенной директивой #define. Это довольно так и интересный атрибут, так что рассмотрим следующий листинг.
#define FINAL
using Sc=System.Console;
class Test
{
[Conditional (“TRIAL”)]
public void Remind()
{
Sc.WriteLine(“Please don’t forget to register your version of ... ” );
Sc.ReadLine();
Sc.WriteLine(“Press Enter if u’re sure that u’ll not forget!!!”);
Sc.ReadLine();
}
[Conditional (“FINAL”)]
public void Hello()
{
Sc.WriteLine(“Hi! Registered user!”);
Sc.WriteLine(“Thank u very much for using this nice prog!”);
Sc.ReadLine();
}
}
Как все догадались, первый метод не будет работать, даже если к нему обратиться, а вот если обратится ко второму, то он даже нас поблагодарит еще. Этот прием вполне подходит для создания различия между шарой и зарегистрированной прогой, хотя само по себе это мало чем поможет.
В следующей статье будет рассмотрена обработка исключительных ситуаций, а потом уже будем автоматизировать IE, покрутим баннеры...
Просто покажу, как это можно делать на С#.