Г. Шилдт - С#4.0 Полное руководство (1160795), страница 108
Текст из файла (страница 108)
Этот синтаксис можно обобщить: позиционные параметры должны указываться в том порядке, в каком они определены в конструкторе, а именованные параметры — в произвольном порядке и вместе с присваиваемыми им значениями. Ниже приведена программа, в которой демонстрируется применение поля Бцрр1евепг в качестве именованного параметра атрибута.
О Использовать именованный параметр атрибута. иа1ПО БуаГЕвГ озлпч Бузсев.яе11есгтоп; 568 Часть (. Язык С() [АССггЬцгебваче (АССгтЬцоетагчегя.А11) ) рцьтгс с1аяя АеиагКАССг1Ьоге : АССг1Ьцге ( ягг1пя рг1 гемагкы // базовое поле свойства Аешагс рпЬ1гс ягг1пЧ Яцрр1еиепС; // это именованный параметр рпЬ11с АеиагКАССг1Ьоге(вггспч соээепг) ( ргг геэагс = совиепг; Яорр1еэепг = "Отсутствует"; ) рпгтгс вггспя Аеэагк ( дес ( гесцгп ргт геиагк; ) [Петагквггг1Ьоге("В этом классе используется атрибут.", Яцрр1ешепг = "Это дополнительная информация.")) с1авя ПвеАССггЬ ( ) с1аяя Иаэебрагавбеэо ( ясасгс топб магп() ( туре С = Суреот(овелггг1Ь) Сопяо1е.нггге("Атрибуты в классе " + С.капе + ": "); обзесг(] аггг1Ьв = С.оегсцяголгкггг1Ьцгея(га1яе); тогеасЬ(оЬ3есг о гп аггггЬя) [ Сопяо1е.нгсге11пе(о); 1 Извлечь атрибут АеэагКАССггбпге.
туре СнеыАСС = Суреог(нетагКАССг1Ьоге); АеэагКАССг1Ъцге га = (АеэагкАССг1Ьцге) АССг1Ьцге.бегспягоэАССг1Ьоге(С, СкеэАСС) Сопяо1е.игтге("Примечание: "); Сопяо1е.нг1геЬ1пе(га.неэагс); Сопяо1е.нггге("Дополнение: "); Сопяо1е.нг1Се11пе(га.яцрр1еэепг)) ) ) При выполнении втой программы получается следующий результат. Атрибуты в классе ПвеАССг1Ь: АеэагКАССг1Ьцге Примечание: В этом классе используется атрибут. Дополнение: Это дополнительная информация.
Превсде чем перейти к следующему вопросу, следует особо подчеркнуть, что поле рг1 геваг)с нельзя использовать в качестве именованного параметра, поскольку оно Глава 17. Динамическая ндентифнкацня гиков, рефваксня н атрибуты 569 закрыто в классе йеыатКАСС т тЬите. Свойство кета тК также нелыя использовать в качестве именованного параметра, потому что оно доступно только для чтения. Напомним, что в качестве именованных параметров могут служить только открытые поля и свойства. Открытое и доступное только для чтения свойство может использоваться в качестве именованного параметра таким же образом, как и открытое поле.
В качестве примера ниже показано, как автоматически реализуемое свойство Рт1от1С у типа 1пт вводится вкласскевагКАттт1Ьите. Использовать свойство в качестве именованного параметра атрибута. иятпд Буятеэ; ия1пд Буятез.кет1есттопг (АттгтЬитепваде(Аттг1Ьитетатдетя.А11)] риЫтс с1аяя Кезагхйттгтбите : АттгтЬите ( ятт1пд рг1 геэатхг !/ базовое поле свойства Незагп риЬ11с ятг1пд Бирр1епептг /! это именованный параметр риЬ11с йеэагКАГГгтЬите(ятгтпд сопппепт) ( ргт геэагт = сопппепт) Бирр1езепг = "Отсутствует"г Ргтогтту = 1г риЫ1с ятгтпд Неиагт ( дег гетигп ргт генах)гГ // Испольэовать свойство в качестве именованного параметра. риЫтс тпт Рг1огтту ( детг яет; ) ) (Везагтйттгтоите("В этом классе используется атрибут." Бирр1езепт = " Это дополнительная информация." Ргтагтгу = 10)! с1аяз ияеяттгтЬ ( ) с1аяя Назебрагаэоеэо ( ягагтс по1б натп() ( Туре т = туреот(ияейтпг1Ы Сопяо1е.кггте("Атрибуты в классе " + Г.кане + ": ") оЬ]ест(] агггтЬя = г.оетсиятозяттг1Ьигея(та1яе)г Еогеасп(оЬ)ест о тп аттгтЬя) ( Сопяо1е.кгттеЬ1пе(о) г ) 570 Часть!.
язык С() Извлечь атрибут АевагХАССг1Ьцге. Туре СаевАСС = Суреое(аеваг)гАССггЬоге)г АевагХАССг1Ьцге га = (НевагХАССг1ЬцСе) АССг1Ьцге.пегсцяговАССггбцге(С, СневАСС)г Сопяо1е.нгТСе("Примечаниег "); Сопяо1е.нг1Сеъгпе(га.аевагк); Сопяо1е.иггсе("Дополнение: "); Сопяо1е.игггеъгпе(га.Яцрр1евепС); сопяо1е.иггсеьгпе("приоритетг " + га.рг1оггсу)г ) Вот к какому результату приводит выполнение этого кода. Атрибуты в классе ПяеАССггЬ: Неваг)сАССггЬцге Примечание: В этом классе используется атрибут. Дополнение: Это дополнительная информация.
Приоритет: 10 В данном примере обращает на себя внимание порядок указания атрибутов перед классом ПяеАССг1Ь, как показано ниже. (АевагХАССг1Ьцге("В этом классе используется атрибут." Япрр1евепг = " Это дополнительная информация." Рггогггу = 10)) с1аяя ПяеАССггЬ /l ) Именованные параметры атрибутов Яцрр1евепс и рг1ог1су не обязательно указывать в каком-то определенном порядке. Порядок их указания можно свободно изменитгч не меняя сами атрибуты.
И последнее замечание: тип параметра атрибута (как позиционного, так и именованного) должен быть одним из всгроенных простых типов, оЬпесС, Туре, перечислением или одномерным массивом одного из этих типов. Встроенные атрибуты В С() предусмотрено несколько встроенных атрибутов, но три из них имеют особое значение, поскольку они применяются в самых разных ситуациях.
Это атрибуты Ассг1Ьцсепяасе, Сопбфс1опа1 и ОЬяо1есе, рассматриваемые далее по порядку. Атрибут А~~гз.ЬШеоааде Как упоминалось ранее, атрибут АССг1ЬПСепяасе определяет типы элементов, к которым может быть применен объявляемый атрибут.
Ассг1Ьцсепзасе — это, по существу, еще одно наименование класса Яуябев. АССг1ЬцСепяадеАССг1Ьцбе. У него имеется следующий конструктор: АССг1Ьцоепяаэе(АССг1ЬцгетагоеСя уа11СОп) Глава 17. Динамическая идентификация типов, рефлексия и атрибуты 571 где уа11с((зп обозначает один или несколько элементов, к которым может быть применен объявляемый атрибут, тогда как АССгЬЬпбетагдегв — перечисление, в котором определяются приведенные ниже значения. А11 С1аяв АввевЬ1у Сопяггпсбог Р1е1с( Ре1едаге Еуепб Еппв Сепегзсрагавегег 1пгегХасе Мебпог( Мое(п1е КегпгпЧа1пе Рагавегег ясгпсс Ргорегбу Два этих значения или более можно объединить с помощью логической операции ИЛИ.
Например, для указания атрибута, применяемого только к полям и свойствам, используются следующие значения. Ассг1ьосетагоеся.гзе16 ( Ассг1ьосетагоеся.Ргорегсу В классе атрибута Ассг1Ьпсепяаде поддерживаются два именованных параметра. Первым из них является параметр А11оимп1 сдр1е, принимающий логическое значение. Если это значение истинно, то атрибут может быть применен к одному и тому же элементу неоднократно. Второй именованный параметр, 1ппегдгес(, также принимает логическое значение. Если это значение истинно, то атрибут наследуется производными классами, а иначе он не наследуется.
По умолчанию параметр А11оимп1стр1е принимает ложное значение (Та1ве), а параметр 1ппегдгег( — истинное значение (Сгпе). В классе атрибута Ассг1Ьпсепяапе определяется также доступное только для чтения свойство ча11с(Оп. Оно возвращает значение типа Ассг1Ьпсетаг хеся, определяющее типы элементов, к которым можно применять объявляемый атрибут. По умолчанию используется значение АССг1Ъпгетагдегя .
А13.. Атрибут Созт(1Ы1оуза1 Атрибут Сепг(1с1опа1 представляет, вероятно, наибольший интерес среди всех встроенных атрибутов. Ведь он позволяет создавать условные методы, которые вызываются только в том случае, если с помощью директивы () с)ет(пе определен конкретный идентификатор, а иначе метод пропускается. Следовательно, условный метод служит альтернативой условной компиляции по директиве ((11.
Сепг)ТС1опа1 — это, по существу, еще одно наименование класса Буябев. РзаЬ(поягзся. Сонг)1С1опа1АССг1Ьпге. Для применения атрибута Сонг)1С1опа1 в исходный код программы следует включить пространство имен Я уз Сев. РЬаппоя Сзся. Рассмотрим применение данного атрибута на следующем примере программы. 1! Продемонстрировать применение встроенного атрибута Сопбзгзопа1.
()г(е11пе ТК1АЬ оязпч Буяпев; пя1по Яуяпев.пзаэповп1ся; с1аяя Теяп ( (Сопбгп1опа1("ТК1АЬ")) то1б Тг1а1() ( Сопво1е.игзпеьзпе("Пробная версия, не "предназначенная дпя распространения."); ) 572 Часть (. Язык СФ (С бгт1 а1("КЕЬЕАЗЕ")) чо1б Ке1евве() ( Сопзо1е.итьгеьтпе("Окончательная рабочая версия."); згзтьс чо1б На1п() ( Тезт С = пен Тевт() С.ттьа1(); //вызывается только в том случае, если определен идентификатор ТК1АЬ С.ве1еазе(); // вызывается только в том случае, если !! определен идентификатор КЕЬЕАЗЕ Эта программа дает следующий результат.
Пробная версия, не предназначенная для распространения. Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяется идентификатор ТК1АЬ. Затем обратите внимание на определение методов Тг1а1 () и Ке1еазе () . Каждому из них предшествует атрибут Сопбфсфопа1, общая форма которого приведена ниже: [Сопбьп1опа1 идентификатор) где идентификатор обозначает конкретный идентификатор, определяющий условие выполнение метода. Данный атрибут может применяться только к методам.