C では、コンパイラ ディレクティブを次のように宣言できます。
#define MY_NUMBER 10
ただし、C#では、これしかできないようです:
#define MY_NUMBER
この場合、これは明らかに役に立ちません。
これは正しいですか、それとも何か間違っていますか? そうでない場合、名前空間またはソリューションレベルでこれを行う方法を誰かが提案できますか? おそらく静的クラスを作成することを考えましたが、それは1つの値に対してやり過ぎのようです。
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 または static readonly を定義でき、条件付きで必要な場合は #if ディレクティブでラップできます
#if DEBUG
private const int MY_NUMBER = 10;
#else
private const int MY_NUMBER = 20;
#endif
はい、あなたは正しいです。 const
本当に唯一のreadonly
オプションです。
私の知る限り、
C# はプリプロセッサ定義を使用してコード内で置換を実行しないため、定数を使用する必要があります。
これでうまくいくはずです:
public const int MY_NUMBER = 10;
次のように列挙型をチェックすることもできます
enum Numbers
{
Nothing = 0,
Dads = 5,
My = 10,
LittleJims = 25
}
したがって、C の MY_NUMBER の代わりに、Numbers.My があります。