#C# でコンパイラ ディレクティブを定義する
-
26-09-2019 - |
質問
C では、次のようにコンパイラ ディレクティブを宣言できます。
#define MY_NUMBER 10
ただし、C# では、次のことしか実行できないようです。
#define MY_NUMBER
この場合、これは明らかに役に立ちません。
これは正しいのでしょうか、それとも私が何か間違ったことをしているのでしょうか?そうでない場合、名前空間またはソリューション レベルでこれを行う方法を誰かが提案できますか?静的クラスを作成することも考えましたが、1 つの値に対してそれはやりすぎのようです。
解決
はい、その通りです。
以下は MSDN ドキュメントからの引用です。
前処理指令は、を提供します ソースファイルのセクションを条件付きでスキップし、エラーと警告条件を報告し、ソースコードの異なる領域を描く機能. 。「前処理指令」という用語は、CおよびC ++プログラミング言語との一貫性のためにのみ使用されます。C#では、個別の前処理ステップはありません。前処理指令は、語彙分析フェーズの一部として処理されます。
したがって、C や C++ のようにコンパイラ定数を実際に定義することはできません。
関連リソース:
他のヒント
他の回答の多くはpublic const
フィールドを使用してお勧めします。 public const
は、それが中で定義されていますが、これまでconst
の値を変更した場合も、すべてのアセンブリを参照しているだけでなく、アセンブリ再コンパイルすることができ強制的に、それを参照するアセンブリにコンパイルされますが注意してください。
あなたが特定されていない場合値が変更に、public static readonly
フィールドはより良い代替手段である持っていることはありません。
はい、あなたは正しいです。 const
とreadonly
は本当にあなたの唯一のオプションがあります。
あなたは、読み取り専用のconstまたは静的に定義することができ、あなたは条件付きでそれをしたい場合は、の#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 の MY_NUMBER の代わりに、Numbers.My が作成されます。
を使用する公共のconst
<時間>私の知る限り、
C#コードで交換を行うためにプリプロセッサ定義を使用しません あなたは定数を使用する必要があります。
これはトリックを行う必要があります:
public const int MY_NUMBER = 10;