Категории
ТОП за месяц
onlinekniga.com » Компьютеры и Интернет » Программирование » Полное руководство. С# 4.0 - Шилдт Герберт

Полное руководство. С# 4.0 - Шилдт Герберт

Читать онлайн Полное руководство. С# 4.0 - Шилдт Герберт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 117 118 119 120 121 122 123 124 125 ... 188
Перейти на страницу:

При выполнении этой программы получается следующий результат.Атрибуты в классе UseAttrib: RemarkAttributeПримечание: В этом классе используется атрибут.Дополнение: Это дополнительная информация.

Прежде чем перейти к следующему вопросу, следует особо подчеркнуть, что полеpri_remark нельзя использовать в качестве именованного параметра, поскольку онозакрыто в классе RemarkAttribute. Свойство Remark также нельзя использовать в качестве именованного параметра, потому что оно доступно только для чтения. Напомним, что в качестве именованных параметров могут служить только открытые поля исвойства.

Открытое и доступное только для чтения свойство может использоваться в качествеименованного параметра таким же образом, как и открытое поле. В качестве примераниже показано, как автоматически реализуемое свойство Priority типа int вводитсяв класс RemarkAttribute.// Использовать свойство в качестве именованного параметра атрибута.using System;using System.Reflection;[AttributeUsage(AttributeTargets.All)]public class RemarkAttribute : Attribute { string pri_remark; // базовое поле свойства Remark public string Supplement; // это именованный параметр public RemarkAttribute(string comment) { pri_remark = comment; Supplement = "Отсутствует"; Priority = 1; } public string Remark { get { return pri_remark; } } // Использовать свойство в качестве именованного параметра. public int Priority { get; set; }}[RemarkAttribute("В этом классе используется атрибут.", Supplement = " Это дополнительная информация.", Priority = 10)]class UseAttrib { // ...}class NamedParamDemo { static void Main() { Type t = typeof(UseAttrib); Console.Write("Атрибуты в классе " + t.Name + "); object[] attribs = t.GetCustomAttributes(false); foreach(object о in attribs) { Console.WriteLine(o); } // Извлечь атрибут RemarkAttribute. Type tRemAtt = typeof(RemarkAttribute); RemarkAttribute ra = (RemarkAttribute) Attribute.GetCustomAttribute(t, tRemAtt); Console.Write("Примечание: "); Console.WriteLine(ra.Remark); Console.Write("Дополнение: "); Console.WriteLine(ra.Supplement); Console.WriteLine("Приоритет: " + ra.Priority); }}

Вот к какому результату приводит выполнение этого кода.Атрибуты в классе UseAttrib: RemarkAttributeПримечание: В этом классе используется атрибут.Дополнение: Это дополнительная информация.Приоритет: 10

В данном примере обращает на себя внимание порядок указания атрибутов передклассом UseAttrib, как показано ниже.[RemarkAttribute("В этом классе используется атрибут.", Supplement = " Это дополнительная информация.",Priority = 10)]class UseAttrib { // ...}

Именованные параметры атрибутов Supplement и Priority не обязательно указывать в каком-то определенном порядке. Порядок их указания можно свободно изменить, не меняя сами атрибуты.

И последнее замечание: тип параметра атрибута (как позиционного, так и именованного) должен быть одним из встроенных простых типов, object, Туре, перечислением или одномерным массивом одного из этих типов.Встроенные атрибуты

В C# предусмотрено несколько встроенных атрибутов, но три из них имеют особое значение, поскольку они применяются в самых разных ситуациях. Это атрибутыAttributeUsage, Conditional и Obsolete, рассматриваемые далее по порядку.Атрибут AttributeUsage

Как упоминалось ранее, атрибут AttributeUsage определяет типы элементов, ккоторым может быть применен объявляемый атрибут. AttributeUsage — это, посуществу, еще одно наименование класса System.AttributeUsageAttribute. У негоимеется следующий конструктор:AttributeUsage(AttributeTargets validOn)

где validOn обозначает один или несколько элементов, к которым может быть применен объявляемый атрибут, тогда как AttributeTargets — перечисление, в которомопределяются приведенные ниже значения.АllAssemblyClassConstructorDelegateEnumEventFieldGenericParameterInterfaceMethodModuleParameterPropertyReturnValueStruct

Два этих значения или более можно объединить с помощью логической операцииИЛИ. Например, для указания атрибута, применяемого только к полям и свойствам,используются следующие значения.AttributeTargets.Field | AttributeTargets.Property

В классе атрибута AttributeUsage поддерживаются два именованных параметра.Первым из них является параметр AllowMultiple, принимающий логическое значение. Если это значение истинно, то атрибут может быть применен к одному и тому жеэлементу неоднократно. Второй именованный параметр, Inherited, также принимаетлогическое значение. Если это значение истинно, то атрибут наследуется производными классами, а иначе он не наследуется. По умолчанию параметр AllowMultiple принимает ложное значение (false), а параметр Inherited — истинное значение (true).

В классе атрибута AttributeUsage определяется также доступное только для чтения свойство ValidOn. Оно возвращает значение типа AttributeTargets, определяющее типы элементов, к которым можно применять объявляемый атрибут. По умолчанию используется значение AttributeTargets.All.Атрибут Conditional

Атрибут Conditional представляет, вероятно, наибольший интерес среди всехвстроенных атрибутов. Ведь он позволяет создавать условные методы, которые вызываются только в том случае, если с помощью директивы #define определен конкретныйидентификатор, а иначе метод пропускается. Следовательно, условный метод служитальтернативой условной компиляции по директиве #if.

Conditional — это, по существу, еще одно наименование класса System.Diagnostics.ConditionalAttribute. Для применения атрибута Conditional в исходный код программы следует включить пространство имен System.Diagnostics.

Рассмотрим применение данного атрибута на следующем примере программы.// Продемонстрировать применение встроенного атрибута Conditional.#define TRIALusing System;using System.Diagnostics;class Test { [Conditional("TRIAL")] void Trial() { Console.WriteLine("Пробная версия, не " + "предназначенная для распространения."); } [Conditional("RELEASE")] void Release() { Console.WriteLine("Окончательная рабочая версия."); } static void Main() { Test t = new Test(); t.Trial(); //вызывается только в том случае, если // определен идентификатор TRIAL t.Release(); // вызывается только в том случае, если // определен идентификатор RELEASE }}

Эта программа дает следующий результат.Пробная версия, не предназначенная для распространения.

Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяетсяидентификатор TRIAL. Затем обратите внимание на определение методов Trial() иRelease(). Каждому из них предшествует атрибут Conditional, общая форма которого приведена ниже:[Conditional идентификатор]

где идентификатор обозначает конкретный идентификатор, определяющий условие выполнение метода. Данный атрибут может применяться только к методам. Еслиидентификатор определен, то метод выполняется, когда он вызывается. Если же идентификатор не определен, то метод не выполняется.

Оба метода, Trial() и Release(), вызываются в методе Main(). Но посколькуопределен один лишь идентификатор TRIAL, то выполняется только метод Trial(),тогда как метод Release() игнорируется. Если же определить идентификаторRELEASE, то метод Release() будет также выполняться. А если удалить определениеидентификатора TRIAL, то метод Trial() выполняться не будет.

Атрибут Conditional можно также применить в классе атрибута, т.е. в классе,наследующем от класса Attribute. Так, если идентификатор определен, то атрибутприменяется, когда он встречается в ходе компиляции. В противном случае он не применяется.

На условные методы накладывается ряд ограничений. Во-первых, они должны возвращать значение типа void, а по существу, ничего не возвращать. Во-вторых, онидолжны быть членами класса или структуры, а не интерфейса. И в-третьих, они немогут предшествовать ключевому слову override.Атрибут Obsolete

1 ... 117 118 119 120 121 122 123 124 125 ... 188
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Полное руководство. С# 4.0 - Шилдт Герберт.
Комментарии