C#では、違いは何ですか
static readonly string MyStr;
そして
const string MyStr;
?
C#では、違いは何ですか
static readonly string MyStr;
そして
const string MyStr;
?
回答:
const文字列を使用すると、コンパイラはcompile-timeで文字列の値を埋め込みます。
したがって、const別のアセンブリで値を使用し、元のアセンブリを更新して値を変更した場合、他のアセンブリは再コンパイルするまで変更を認識しません。
static readonly文字列は、実行時に見上げます通常のフィールドです。したがって、フィールドの値が別のアセンブリで変更された場合、その変更は、アセンブリが読み込まれるとすぐに再コンパイルされずに確認されます。
また、これはことを意味しstatic readonly、文字列のような、非定数のメンバーを使用することができますEnvironment.UserNameかDateTime.Now.ToString()。const文字列は、他の定数やリテラルを使用して初期化することができます。
また、static readonly文字列は静的コンストラクタで設定できます。const文字列はインラインで初期化することができます。
a static stringは変更できることに注意してください。static readonly代わりに使用する必要があります。
const定数にのみ使用する必要があります-定数は決して、決して、決して変化しない値です。
private const厳密には定数ではない値に使用することを認めます。基本的にはconst、マイクロ最適化の目的で誤用しています。私が偽善者になったとしても、私は「これまでに、これまでに、これまでに」という発言を支持します。;)
ここに長所と短所の良い内訳があります:
したがって、値が変更される可能性が非常に低い場合、または外部アプリ/ライブラリが定数を使用しない場合は、定数を使用する必要があるようです。実行時の計算が必要な場合、または外部のコンシューマーが重要な場合は、静的な読み取り専用フィールドを使用する必要があります。
constpublic const string MyStr;
あるコンパイル時の定数は、(あなたがたとえば、メソッドのパラメータのデフォルトパラメータとして使用することができます)、そしてそれはなりません、あなたがそのような技術を使用している場合は難読化され
static readonlypublic static readonly string MyStr;
あるランタイム定数が。これは、アプリケーションが起動されるときではなく、起動されるときに評価されることを意味します。これが、たとえばメソッド(コンパイルエラー)のデフォルトパラメータとして使用できない理由です。そこに格納されている値は難読化できます。
OQはstatic stringvs について尋ねましたconst。どちらも使用例が異なります(どちらも静的として扱われます)。
constは、真に一定の値のみに使用してください(たとえば、光の速度。ただし、これは媒体によって異なります)。この厳密なガイドラインの理由は、const値がそれを参照するアセンブリでのconstの使用に置き換えられるためです。つまり、constが定義の場所で変更された場合、バージョン管理の問題が発生する可能性があります(つまり、定数ではなかったはずです)結局)。private constベースとサブクラスが異なるアセンブリにあり、プライベートフィールドが継承されるため、これはフィールドにも影響することに注意してください。
静的フィールドは、それらが宣言されているタイプに関連付けられています。これらは、特定のタイプのすべてのインスタンスで同じである必要がある値を表すために使用されます。これらのフィールドは、何回でも書き込むことができます(指定された読み取り専用でない限り)。
static readonlyvs を意味する場合は、将来の証拠となるため、ほとんどすべてのケースでconstお勧めstatic readonlyします。