|
Программирование >> Программирование с использованием ajax
ких щелчков кнопкой мыши найти все классы, производные от System.Attribute. Это средство одно из тех, которым определенно не стоит пренебрегать. Кроме того. Reflector позволяет выполнять декомпиляцию методов и преобразовывать код IL в исходный текст С#, что может быть очень полезно при анализе внутренней механики определенного кода .NET. System.Diagnostics.ConditionalAttribute Это один из наиболее полезных атрибутов, поскольку он позволяет включать или исключать фрагменты кода в зависимости от определения символа во время компиляции. Этот атрибут определен в пространстве имен System. Diagnostics, которое включает классы, предназначенные для отладки и трассировки вывода, регистрации событий, счетчиков производительности и получения информации о процессах. Использование этого атрибута демонстрируется в следующем практическом занятии. using System; using System.Diagnostics; namespace TestConditional class Program { static void Main(string[] args) { Вызов метода, доступного, только если символ DEBUG определен... Program.DebugOnly(); Этот метод снабжен атрибутом и будет включен в порожденный код, ТОЛЬКО если символ DEBUG определен во время компиляции программы. [Conditional( DEBUG )] public static void DebugOnly() Эта строка будет отображаться только в отладочных компоновках... Console.WriteLine( This string only displays in Debug ); Исходный код этого примера доступен в каталоге Chapter30/03 Test Conditional. Код вызывает статический метод DebugOnly (), снабженный атрибутом Conditional, как видно из раздела [Conditional ( DEBUG ) ] приведенного кода. Эта функция всего лишь выводит строку текста на консоль. При компиляции исходного файла С# символы можно определять в командной строке. Атрибут Conditional ведет к пропуску обращений к коду, помеченному соответствующим символом на этапе компиляции. Поэтому при наличии метода, помеченного как [Conditional ( DEBUG ) ], вызовы этого метода существуют только, если символ DEBUG определен во время компиляции. При компиляции отладочной (Debug) версии в среде Visual Studio 2008 символ DEBUG устанавливается автоматически. Если нужно определить или переопределить символы для конкретного проекта, откройте диалоговое окно Properties проекта и перейдите к опции Build (Компоновка) страницы Configuration Properties (Свойства конфигурации), как показано на рис. 30.4. Applketion Build Bufld Evtntt Dbug RMOurces ServKes Reference Pathi j Configuretren: [Active (Debu Ptartorm: I Active CPU) Conditional comp<l tK}n symbols: DHine DEBUG constant ✓ Define TRACE constant Platform targ t [i I Allow unsafe code Optimize code Puc. 30.4. Страница Build свойств проекта Обратите внимание, что по умолчанию для компоновки Debug определены оба символа DEBUG и TRACE. Чтобы определить символ в командной строке, используйте переключатель /d: (сокращенная форма записи переключателя /define: - при желании эту строку можно вводить полностью): > CSC /d:DEBUG TestConditional.es Если скомпилировать и запустить файл, на консоли отобразится строка вывода This string only displays in Debug (Эта строка отображается только в режиме отладки). Если назначение компоновки изменить на Release и выполнить приложение, эта строка не будет отображаться в окне консоли. Чтобы получить более ясное представление о происходящем, воспользуйтесь программой Ildasm для просмотра сгенерированного кода (рис. 30.5). Х;\03 TejtCond.tionar4TestCofxJttionaI\b.n\Deb-. Fife View Ие р ► MANIFEST Щ TestCondtranai i-i TestConditional Program ► cl*5S private auto апя befofefiekkut ctor void() J DebugOnly vo4d() LJ Man vo J(strf>g(]) .aseemby TestCondlttonal Puc. 30.5. Использование Ildasm для просмотра сгенерированного кода Когда символ DEBUG не определен, код IL, сгенерированный для метода Main (), лмеет следующий вид: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint Размер кода 1 (0x1) .maxstack 8 IL 0000: ret } конец метода Program::Main Этот код просто выполняет возврат из метода Main. Однако при компиляции файла с использованием переключателя /d: DEBUG генерируемый код будет иметь следующий вид: .method private hidebysig static void Main(string[] args) cil managed { entrypoint Размер кода 8 (0x8) .maxstack 8 IL 0000: nop IL 0001: cal 1 void Tes tCondi tional. Program: : DebugOnly () IL 0006: nop IL 0007: ret } конец метода Program::Main Выделенная строка - вызов условно скомпилированного метода. Применение метода Conditional () удаляет вызовы метода, но не сам метод. Атрибут Conditional можно использовать только с методами, которые возвращают значение void - в противном случае удаление вызова означало бы, что никакое значение не было возвращено. Однако этим атрибутом можно пометить метод, обладающий параметрами out или ref - переменные сохранят свои исходные значения. Итак, подытожим: атрибут Conditional ведет к пропуску вызовов тех методов, которые помечены этим атрибутом, если соответствующий символ определен во время компиляции. Класс Debug из пространства имен System. Diagnostics содержит ряд статических методов, снабженных атрибутом [Conditional ( DEBUG ) ], которые используются для вывода отладочной информации во время выполнения приложения. При переключении на окончательную компоновку все вызовы этих методов опускаются из результирующей сборки. Это - прекрасный способ добавления отладочной информации и автоматического ее удаления при компоновке окончательной версии программного продукта. System. ObsoleteAttr ibute Этот атрибут ориентирован на детали, которые разработчики Microsoft помещают в каркас .NET Framework. Атрибут Obsolete можно использовать для пометки класса, метода или любого другого компонента сборки как больше не используемого. Например, он может быть полезен при публикации библиотеки классов. В ходе разработки набора классов некоторые из этих классов/методов/свойств неизбежно окажутся заменены более совершенными. Этот атрибут можно использовать для подготовки пользователей кода к возможному удалению конкретной функциональной возможности. Предположим, что первая версия приложения содержит класс, подобный следующему: public class Coder { public Coder () public void CodelnCPlusPlus () {
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |