Книга: 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";
}