C#の「const string」と「static readonly string」


回答:


171

const文字列を使用すると、コンパイラはcompile-timeで文字列の値埋め込みます。
したがって、const別のアセンブリで値を使用し、元のアセンブリを更新して値を変更した場合、他のアセンブリは再コンパイルするまで変更を認識しません。

static readonly文字列は、実行時に見上げます通常のフィールドです。したがって、フィールドの値が別のアセンブリで変更された場合、その変更は、アセンブリが読み込まれるとすぐに再コンパイルされずに確認されます。

また、これはことを意味しstatic readonly、文字列のような、非定数のメンバーを使用することができますEnvironment.UserNameDateTime.Now.ToString()const文字列は、他の定数やリテラルを使用して初期化することができます。
また、static readonly文字列は静的コンストラクタで設定できます。const文字列はインラインで初期化することができます。

a static stringは変更できることに注意してください。static readonly代わりに使用する必要があります。


25
+1、そして明白な結論、実用的で意味論的な観点から:const定数にのみ使用する必要があります-定数は決して決して決して変化しない値です。
LukeH 2010

3
@LukeH は決して、決して、これまでは少し強いです。プライベート文字列をconstとして宣言し、2つの再コンパイルイベント間で変更した場合に発生する悪いことは考えられません。
ブレンダベル

5
@ブレンダ:私はprivate const厳密には定数ではない値に使用することを認めます。基本的にはconst、マイクロ最適化の目的で誤用しています。私が偽善者になったとしても私は「これまでに、これまでに、これまでに」という発言を支持します。;)
LukeH

特にストリングの場合のパフォーマンスはどうですか?constを使用するたびに、メモリ内に文字列の新しいコピーが作成されますか?
Andrii

@Andriiいいえ、定数文字列は一度作成されます。各使用法は、メモリ内で同じ参照を持ちます。
ミッグ

43

ここに長所と短所の良い内訳があります:

したがって、値が変更される可能性が非常に低い場合、または外部アプリ/ライブラリが定数を使用しない場合は、定数を使用する必要があるようです。実行時の計算が必要な場合、または外部のコンシューマーが重要な場合は、静的な読み取り専用フィールドを使用する必要があります。


19
記事からの非常に興味深い点-「高いレベルでは、定数はコンパイル時に処理されますが、静的な読み取り専用フィールドは実行時に評価されるときに設定されます。定数値はコンパイラーによって置き換えられるという事実は、定数値を参照するライブラリ/アセンブリは、定数値が変更された場合、再コンパイルする必要があることを意味します。静的な読み取り専用フィールドを参照するライブラリは、値ではなくフィールドを参照するため、フィールドの変更を必要とせずに取得します再コンパイル用」
s_hewitt 2010

1
ええ、私もそれを読んで、ちょっと時間を過ごしました。私は間違いなくそれを知りませんでした。
スピノン

Googleのキャッシュバージョンは次のとおりです。webcache.googleusercontent.com
spinon

2
参照リンクは使用できなくなりました。
Salomon Zhang

これは、解決策としてマークされた回答に対する優れた賛辞です。使用法を定義すると非常に役立ちます。私からの+1。
Bonez024 2018

11

const

public const string MyStr;

あるコンパイル時の定数は、(あなたがたとえば、メソッドのパラメータのデフォルトパラメータとして使用することができます)、そしてそれはなりません、あなたがそのような技術を使用している場合は難読化され

static readonly

public static readonly string MyStr;

あるランタイム定数が。これは、アプリケーションが起動されるときではなく、起動されるときに評価されることを意味します。これが、たとえばメソッド(コンパイルエラー)のデフォルトパラメータとして使用できない理由です。そこに格納されている値は難読化できます。


6

OQはstatic stringvs について尋ねましたconst。どちらも使用例が異なります(どちらも静的として扱われます)。

constは、真に一定の値のみに使用してください(たとえば、光の速度。ただし、これは媒体によって異なります)。この厳密なガイドラインの理由は、const値がそれを参照するアセンブリでのconstの使用に置き換えられるためです。つまり、constが定義の場所で変更された場合、バージョン管理の問題が発生する可能性があります(つまり、定数ではなかったはずです)結局)。private constベースとサブクラスが異なるアセンブリにあり、プライベートフィールドが継承されるため、これはフィールドにも影響することに注意してください。

静的フィールドは、それらが宣言されているタイプに関連付けられています。これらは、特定のタイプのすべてのインスタンスで同じである必要がある値を表すために使用されます。これらのフィールドは、何回でも書き込むことができます(指定された読み取り専用でない限り)。

static readonlyvs を意味する場合は、将来の証拠となるため、ほとんどすべてのケースでconstお勧めstatic readonlyします。


あなたが話しているこの「OQ」は誰ですか?
Peter Mortensen、

「元の質問」
ベンアストン

0

あなたは、の値を変更することができるstatic readonly stringだけでstatic、あなたがの値を変更することはできません一方で、クラスや変数初期化子のコンストラクタconst文字列の任意の場所を。


2
これが既存の回答がすでに言っていることを超えて何が追加されるのかわかりません。
モニカの訴訟に資金
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.