Книга: C# для профессионалов. Том II

Условная компиляция

Условная компиляция

Препроцессор в C# эмулируется. Он выполняется как отдельный процесс, прежде чем компилятор начнет свою работу. Поддерживаемые здесь директивы больше всего соответствуют C++, чем какому-либо другому языку. Конечно, в Java не существует эквивалентов функциональности, описанных в этом разделе. Разрешается определять символы, которые проверяются с помощью простых условных директив. Те, которые оказываются true, включаются и компилируются, иначе код игнорируется. Определение символа может происходить двумя способами. Прежде всего с использованием ключа компилятора /define, за которым следует двоеточие и определяемый символ, например:

csc /define:TEST_TEST samples.cs

Можно также определить символы на странице конфигурационных свойств проекта, добавляя их в разделенный двоеточиями список констант условной компиляции. Или пойти программным путем, используя директиву #define. В этом случае директива должна появиться раньше, чем что-либо другое, и применяется ко всем лексемам в области действия файла. Здесь перечислены допустимые условные директивы:

#if используется для проверки существования символа

#elif позволяет добавить несколько ветвей к инструкции #if

#else предоставляет окончательное альтернативное условие для #if и #elif

#endif заканчивает инструкцию #if
namespace Samples {
 using System;
#if EXAMPLE
 public class Example {
  public Example() {
  }
 }
#elif TEST_TEST
 public class Test {
  public Test() {
  }
 }
#else
 public class None {
  public None() {
  }
 }
#endif

}

Добавление инструкции #define TEST_TEST делает класс Test видимым для компиляции, a #define EXAMPLE делает класс Example видимым для компиляции. Если ничего не добавлять, то будет компилироваться класс None. Для препроцессора C# доступны также две другие директивы — #warning и #error. Они должны помещаться в условное выражение #if. Попробуйте добавить следующую строку под инструкцией #else в приведенный код:

#warning I wouldn't try to instantiate the example object if I were you

C# также поддерживает условную функциональность. В коде ниже добавление условного атрибута в AMethod() делает его компилируемым только в том случае, когда определен символ Test:

[conditional("TEST_TEST")]
public void AMethod() {
 string s = "I am available only when Test is defined";
}

Оглавление книги


Генерация: 0.291. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз