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