- 締切済み
.NET言語の定数について
記述の違い以外は.NETの言語共通の質問になるのですが、 質問はC#で質問いたします。 定数を表すのに const double PI = 3.14; static readonly double PI = 3.14; などと2つの書き方があるようですが、使い分けの 仕方がわかりません。 どのような場合に、どちらを使うものなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Bonjin
- ベストアンサー率43% (418/971)
とりあえず、C#のリファレンスには readonly キーワードは、const キーワードとは異なります。const フィールドは、フィールドの宣言でしか初期化できません。readonly フィールドは、宣言またはコンストラクタのどちらかで初期化できます。このため、readonly フィールドは、使用するコンストラクタに応じて異なる値を持つことができます。また、const フィールドがコンパイル時定数であるのに対し、readonly フィールドは実行時定数として使用できます。 と書いてあります。
- himajin100000
- ベストアンサー率54% (1660/3060)
いきなり誤訳発見 >コンパイルするまで値がわからないような コンパイルの地点では値がわからないような
- himajin100000
- ベストアンサー率54% (1660/3060)
あまり意識した事がありませんでした。 http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx にまさにぴったりな記述がありましたので紹介します。 ただ、英文の意味が理解出来たような出来てないような。 一応和訳しておいておきますが、誤訳の可能性大ですので慎重に。 The C# team posts answers to common questions C#チームは一般的な質問に対する答えを投稿した What is the difference between const and static readonly? constと static readonlyの違いは何か? The difference is that the value of a static readonly field is set at run time, 違いは static readonly fieldは実行時にセットされると言うことだ。 and can thus be modified by the containing class, whereas the value of a const field is set to a compile time constant. constはコンパイルされた時の値に固定されるけど だから、含むクラスによって変更されることができるんだ。 In the static readonly case, the containing class is allowed to modify it only static readonlyの場合、以下の含むクラスが修正することがすることが許される * in the variable declaration (through a variable initializer) 変数宣言 * in the static constructor (instance constructors, if it's not static) Staticなコンストラクタ(Staticでなければインスタンスのコンストラクタ) static readonly is typically used if the type of the field is not allowed in a const declaration, or when the value is not known at compile time. static readonlyは主に、その変数の型(クラスも?)が定数宣言において許されない時やコンパイルするまで値がわからないような場合に使われる Instance readonly fields are also allowed. インスタンスのreadonlyなフィールドもまた許されている Remember that for reference types, in both cases (static and instance) the readonly modifier only prevents you from assigning a new reference to the field. It specifically does not make immutable the object pointed to by the reference. 参照型においては、Static、インスタンス共に、readonlyはそのフィールドに対して新たな参照を許さないということを覚えておいて欲しい It specifically does not make immutable the object pointed to by the reference. それ(staticなフィールドは)参照によって示されるオブジェクトを不変にはしない class Program { public static readonly Test test = new Test(); static void Main(string[] args) { test.Name = "Program"; test = new Test(); //エラー: Staticのコンストラクタや変数生成の場合以外はstaticなフィールドを割り当てられない } } class Test { public string Name; } On the other hand, if Test were a value type, then assignment to test.Name would be an error. 一方でTestがvalue type(訳注:?)ならtest.Nameはエラーになるだろう。