# Определить директиву компилятора в C#
В Си я мог бы объявить директиву компилятора следующим образом:
#define MY_NUMBER 10
Тем не менее, в C# я, кажется, только могу сделать это:
#define MY_NUMBER
Что, очевидно, бесполезно в этом случае.
Это правильно, или я делаю что-то не так? Если нет, может кто-нибудь предложить способ сделать это, на уровне имен или уровне решения? Я думал о создании статического класса, но это кажется излишним для одного значения.
6 ответов
Да, это правильно.
Вот цитата из документации MSDN:
Директивы предварительной обработки предоставляют возможность условно пропускать разделы исходных файлов, сообщать об ошибках и состояниях предупреждения, а также выделять отдельные области исходного кода. Термин "директивы предварительной обработки" используется только для согласованности с языками программирования C и C++. В C# нет отдельного этапа предварительной обработки; директивы предварительной обработки обрабатываются как часть фазы лексического анализа.
Таким образом, вы не можете определить константы компилятора, как в C и C++.
Связанные ресурсы:
Многие другие ответы предлагают использовать public const
поле. Обратите внимание, что public const
будет скомпилирован в сборки, ссылающиеся на него, что заставит вас перекомпилировать не только сборку, в которой он определен, но и каждую сборку, ссылающуюся на него, если вы когда-либо измените значение const
,
Если вы не уверены, что значение никогда не изменится, public static readonly
поле является лучшей альтернативой.
Да, ты прав. const
а также readonly
действительно ваши единственные варианты.
Вы можете определить const или static только для чтения, и если вы хотите его условно, вы можете обернуть его в директиву #if
#if DEBUG
private const int MY_NUMBER = 10;
#else
private const int MY_NUMBER = 20;
#endif
Вы также можете проверить перечисления, как
enum Numbers
{
Nothing = 0,
Dads = 5,
My = 10,
LittleJims = 25
}
Итак, вместо C's MY_NUMBER, у вас есть Numbers.My.
Используйте публичный конст
НАСКОЛЬКО МНЕ ИЗВЕСТНО,
C# не использует препроцессорные определения для выполнения замены в коде, поэтому вы должны использовать константу.
Это должно сделать трюк:
public const int MY_NUMBER = 10;