# Определить директиву компилятора в C # - PullRequest
7 голосов
/ 10 июня 2010

В C я мог бы объявить директиву компилятора следующим образом:

#define MY_NUMBER 10

Однако в C # мне кажется, что я могу это сделать только:

#define MY_NUMBER

Что, очевидно, бесполезно в этом случае.

Это правильно, или я что-то не так делаю? Если нет, может кто-нибудь предложить способ сделать это, либо на уровне имен или на уровне решения? Я подумал о создании статического класса, но это кажется излишним для одного значения.

Ответы [ 6 ]

6 голосов
/ 10 июня 2010

Да, это правильно.

Вот цитата из документации MSDN:

Директивы предварительной обработки предоставляют возможность условно пропустить разделы исходных файлов, чтобы сообщить об ошибках и условиях предупреждения, а также выделить отдельные области исходного кода .Термин «директивы предварительной обработки» используется только для согласованности с языками программирования C и C ++.В C # нет отдельного этапа предварительной обработки;директивы предварительной обработки обрабатываются как часть фазы лексического анализа.

Таким образом, вы не можете определить константы компилятора, как в C и C ++.

Связанные ресурсы:

5 голосов
/ 10 июня 2010

Многие другие ответы предлагают использовать поле public const. Однако обратите внимание, что public const будет скомпилирован в сборки, ссылающиеся на него, что заставит вас перекомпилировать не только сборку, в которой он определен, но и каждую сборку, ссылающуюся на него, если вы когда-либо измените значение const.

Если вы не уверены, что значение никогда не изменится, лучшим вариантом будет поле public static readonly.

3 голосов
/ 10 июня 2010

Вы можете определить const или static только для чтения, и если вы хотите его условно, вы можете обернуть его в директиву #if

#if DEBUG
private const int MY_NUMBER = 10;
#else
private const int MY_NUMBER = 20;
#endif
3 голосов
/ 10 июня 2010

Да, вы правы. const и readonly действительно ваши единственные варианты.

1 голос
/ 11 июня 2010

Вы также можете проверить перечисления, например

enum Numbers
{
    Nothing = 0,
    Dads = 5,
    My = 10,
    LittleJims = 25
}

Так что вместо MY's_NUMBER у вас есть Numbers.My.

1 голос
/ 10 июня 2010

Использовать public const


AFAIK,

C # не использует предварительный процессор для определения замены в коде, поэтому необходимо использовать константу.

Это должно сделать трюк:

public const int MY_NUMBER = 10;
...