# Определить директиву компилятора в 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;
Другие вопросы по тегам