Программирование >>  Программирование с использованием ajax 

1 ... 314 315 316 [ 317 ] 318 319 320 ... 396


ких щелчков кнопкой мыши найти все классы, производные от 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 () {



1 ... 314 315 316 [ 317 ] 318 319 320 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика