Г. Шилдт - С#4.0 Полное руководство (1160795), страница 102
Текст из файла (страница 102)
Оператор ая может использоваться только для преобразования ссылок, идентичности, упаковки, распаковки. В некоторых случаях оператор аз может служить удобной альтернативой оператору 1я. В качестве примера рассмотрим следующую программу, в которой оператор 1з используется для предотвращения неправильного приведения типов. О использовать оператор ья для предотвращения неправидьного приведения типов.
ояьпд Яуясещ( с1аяя А () с1аяя В : А () с1аяя СЬесксаяс ( яоаолс Уо1г( Ма1п () ( А а = пен А(); В Ь = пен В(); /! Проверить, можно ли привести а к типу В. 11(а 1я В) // если да, то выполнить приведение типов Ь = (В) а; е1ве УУ если нет, то пропустить приведение типов Ь = по11( ьс(Ь== отц Сопяо1е.Хгьгеъ1пе("Приведение типов Ь = (В) НВ допустимо.") е1яе Сопяо1е.иг1сеъ1пе("Приведение типов Ь = (В) допустимо."); ) ) 540 Часть (.
Язык С№ Эта программа дает следующий результат. Приведение типов Ь = (В) НЕ лопустимо. Как следует из результата выполнения приведенной выше программы, тип объекта а не совместим с типом В, и поэтому его приведение к типу В не допустимо и предотвращается в условном операторе ТТ. Но такую проверку приходится выполнять в два этапа. Сначала требуется убедиться в обоснованности операции приведения типов, а затем выполнить ее. Оба этапа могут быть объединены в один с помощью оператора ая, как демонстрирует приведенная ниже программа. Продемонстрировать применение оператора ая.
оя1пд Зуягеаи с1аяя А () с1аяя В : А () с1аяя Саесхсаяг ясасьс уоьс( наьп() ( А а = лен А(); ВЬ= пен В(); Ь = а ав В; // выполнить приведение типов, если зто возможно ТГ(Ь==по11) Сопяо1е.Хгьяеьгпе("Приведение типов Ь = (В) НЕ допустимо.") е1яе Сопяо1е.Хг1геьгпе("Приведение типов Ь = (В) попустимо."); ) ) Эта программа дает прежний результат. Приведение типов Ь = (В) НЕ допустимо. В данном варианте программы в одном и том же операторе ая сначала проверяется обоснованность операции приведения типов, а затем выполняется сама операция приведения типов, если она допустима.
Применение оператора йуреой Несмотря на всю свою полезность, операторы ая и 1я проверяют лишь совместимость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в С)) предусмотрен оператор Суреог. Он извлекает объект класса Еуягепг. Туре для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Ниже приведена общая форма оператора Суреог: суреот(тип) где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Туре. Получив объект класса туре для заданного типа, можно извлечь информацию о нем, используя различные свойства, поля и методы, определенные в классе Туре.
Класс Туре довольно обширен и содержит немало членов, поэтому его рассмотрение придется отложить до следующего раздела, посвященного рефлексии. Но в качестве краткого введения в этот класс ниже приведена программа, в которой используются Глава 17. Динамическая идентификация типов, рефлексия и атрибуты 541 три его свойства: рп11Нап(е, 1ЯС1аяя и 1ЯАЬЯСгасг.
Для получения полного имени типа служит свойство т О11наве. Свойство 1ЯС1аяя возвращает логическое значение сгпе, если тип относится к классу. А свойство 1 ЯАья с гас с возвращает логическое значение сгпе, если класс является абстрактным. Продемонстрировать применение оператора суреог. пв1пч Яувсепы пв1по Яувгеы.10( с1авя Оветуреог ( вгаг1с вота Матп() ( туре с = суреог(Ясгеаыпеабег) Сопво1е.нгьгеъ1пе(с.гп11наве); 11(С.1вС1авв) Сопво1е.Хг1Секвпе("Относится к классу."); 11(С.1яАЬявгаст) Сопяо1е.Хгьтеъвпе("Является абстрактным классом.") е1ве Сопво1е.Хгьгеъьпе("Является конкретным классом."); ) ) Эта программа дает следующий результат. Яуввеы.го.явгеаыкеабег Относится к классу.
Является конкретным классом. В данной программе сначала извлекаетсл объект класса туре, описывающий тип Ябгеаыпеабег. Затем выводится полное имя этого типа данных и определяетсл его принадлежность к классу, а далее — к абстрактному или конкретному классу. Рефлексия Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин рефлексия, или отражение, происходит от принципа действия этого средства: объект класса Туре отражает базовый тип, который он представляет. Для получения информации о типе данных объекту класса Туре делаются запросы, а он возвращает (отражает) обратно информацию, связанную с определяемым типом.
Рефлексия являетсл эффективным механизмом, поскольку она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения. Многие классы, поддерживающие рефлексию, входят в состав прикладного интерфейса .)ь(ЕТ яеяесбоп АР1, относящегося к пространству имен Яуя С ел(. Не()есб Топ. Поэтому для применения рефлексии в код программы обычно вводится следующая строка. св1пд Яуввев.пе11есвьоп; Класс Вуе1еп(.
Туре — ядро подсистемы рефлексии Класс Яувгеы. Туре составляет ядро подсистемы рефлексии, поскольку он инкапсулирует тип данных. Он содержит многие свойства и методы, которыми можно 542 Часть (. Язык С() пользоваться для получения информации о типе данных во время выполнения. Класс Туре является производным от абстрактного класса Буясев. Ке11есс1оп. МевЬег1п1о. В классе МевЬег1п То определены приведенные ниже свойства, доступные только для чтения.
Свойство Описание Туре Рес1аг1пдтуре Тип класса или интерфейса, в котором объявляется отра- жаемый член Тип члена. Зто значение обозначает, является ли член по- лем, методом, свойством, событием или конструктором Значение, связанное к конкретными метаданными Объект типа мос(и1е, представляющий модуль (исполняе- мый файл), в котором находится отражаемый тип Имя типа Тип отражаемого объекта МетЬегТурея МевЬегТуре Тпг Месас(асаТокеп Мос)и1е Мог)и1е ягг1по Нате Туре Ке1)естес)туре Следует иметь в виду, что свойство МевЬегТуре возвращает тип МевЬегТурея— перечисление, в котором определяются значения, обозначающие различные типы членов.
К их числу относятся следующие. Метъегтурея.оопясгистог Метъегтурея.несиоо МетЬегТурея.гте1а НетЬегтурея.вчепп МетЬегтурея.Ргорегсу Метод Назначение Сопясгисгог1пто[) аеССопятгисгогя() Еиепс1пТо[) СесЕиептя() Ете1с)1пто [) Сет Е1е1с(я () Туре [) сессепегтсАгоитепся() Получает список конструкторов для заданного типа Получает список событий для заданного типа Получает список полей для заданного типа Получает список аргументов типа, связанных с закрыто сконструированным обобщенным типом, или же спи- сок параметров типа, если заданный тип определен как обобщенный. Для открыто сконструированного типа этот Следовательно, тип члена можно определить, проверив свойство МетЬегТуре. Так, если свойство метЬегтуре имеет значение метЬегтурея.
неспос(, то проверяемый член является методом. В класс мевЬег1пто входят два абстрактных метода: СесСияготлссг1Ьигея () и 1япет(пес) () . Оба метода связаны с атрибутами. Первый из них получает список специальных атрибутов, имеющих отношение к вызывающему объекту, а второй устанавливает, определен ли атрибут для вызывающего метода. В версию )х[ЕТ Етагпеигог1 'тетя(оп 4.0 внедрен метод СеГСияговдссг1Ьигеярага (), возвращающий сведения о специальных атрибутах. (Подробнее об атрибутах речь пойдет далее в этой главе.) Класс Туре добавляет немало своих собственных методов и свойств к числу тех, что определены в классе МевЬег1пто.
В качестве примера ниже перечислен ряд наиболее часто используемых методов класса туре. Б)ава 17. Динамическая идентификация типов, рефлексия и атрибуты 543 Окончание гпабпииы Метод Назначение список может содержать как аргументы, так и параметры мпа. (Более подробно обобщения рассматриваются в главе 18.) Получает список членов для заданного типа мегпЬе г1 п1о ( ) ОесмегпЬетв () Мегпос)1пго [) ЕеСМегпог)5() Ргореггу1пбо[) беСРгорегг1ез() Получает список методов для заданного типа Получает список свойств для заданного типа Далее приведен ряд наиболее часто используемых свойств, доступных только для чтения и определенных в классе Туре.