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