• 締切済み

.NET言語の定数について

記述の違い以外は.NETの言語共通の質問になるのですが、 質問はC#で質問いたします。 定数を表すのに const double PI = 3.14; static readonly double PI = 3.14; などと2つの書き方があるようですが、使い分けの 仕方がわかりません。 どのような場合に、どちらを使うものなのでしょうか?

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

とりあえず、C#のリファレンスには readonly キーワードは、const キーワードとは異なります。const フィールドは、フィールドの宣言でしか初期化できません。readonly フィールドは、宣言またはコンストラクタのどちらかで初期化できます。このため、readonly フィールドは、使用するコンストラクタに応じて異なる値を持つことができます。また、const フィールドがコンパイル時定数であるのに対し、readonly フィールドは実行時定数として使用できます。 と書いてあります。

回答No.2

いきなり誤訳発見 >コンパイルするまで値がわからないような コンパイルの地点では値がわからないような

回答No.1

あまり意識した事がありませんでした。 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はエラーになるだろう。

関連するQ&A

  • エクセルVBAの定数

    こんにちは! 定数について質問です。 VBAのユーザー定義定数ってVBEに記述する以外に宣言する方法はありませんでしょうか?詳しくないですがC言語のようにヘッダーファイルにリンクするように手軽でやりたいのですが無理でしょうか?

  • 定数について

    定数の使用の仕方について悩んでいます。 インターフェースに定数を宣言して、 それを実装(Implements)し使う方法と、 クラスで定数を宣言して、 それを参照して使う方法とで悩んでいます。 どちらもstaticな定数を使用しているのですが、 パフォーマンス面での違いとかはないのでしょうか? もし、定数の取り扱いについてほかにいい方法があるのであれば、 教えてほしいです。 お願いします。

  • C#で、定数をフラグ(if文)によって切り替え

    C#ですが、カテゴリが無いのでC/C++のカテゴリに入れています。 基本的に変数(定数)の宣言は1回しか出来ないとわかっていますが、 以下の様な定義を何とかできないでしょうか? if (true) { public static readonly string Flag = "True"; } else { public static readonly string Flag = "False"; } これって、変数を使って、以下のようにするしか無いですよね…… public static string Flag = ""; if (true) { Flag = "True"; } else { Flag = "False"; } もしくは、変数で宣言した物を、途中で定数にする事は可能でしょうか? 目的としては、グローバルで宣言した変数を別の関数で変更されないようにしたいだけなのですが。 何か、手があれば教えてください。

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • 特定のクラスだけで const 変数を有効にしたい

    円周率のような “意味を持つ定数” を C++ では以下のようにするのをよく見かけます。 const double PI = 3.1415926; これを特定の 1 つのファイル内だけで有効にする方法はありませんか? 例えばあるクラス Hoge.cpp と Hoge.h のみで上記の PI を使う,というように。 Hoge.h をインクルードするファイルにおいては PI を無効にしたいのです。 C++ 超初心者につき,マヌケな質問をしているかもしれないですが,ご教授願えたら幸いです。

  • CやC++に今後追加して欲しい機能ってありますか?

    個人的にC言語はC++があるので今のままでいいと思いますが、 C++には class Test_c {  static const int VarI = 10; //これは従来もOK  static const float VarF = 10.5; //これは整数以外なのでアウト  static const char * Str1 = "テスト文字列" //これもアウト public: } 見たいにフィールドで整数以外のstatic constもできるようにして欲しいです。

  • C言語にPGに関する質問ですが

    C言語にPGに関する質問ですが、引数として(const char **)&cstrpと(char **)&cstrpとどんな違いがあるんですか?教えてください。

  • 定数式とはどういう意味でしょうか。

    Microsoft Visual C++ 5.0を使っています。 いつもLINUXでCのコンパイルをしているのですが、Win上でコンパイルすると 「error C2057: 定数式が必要です。」 とでます。 このエラーの指し示すのは、 double x[N]; というような配列の宣言のようです。 ちなみにNは、ヘッダーに const int N = 2; と定義しています。 このエラーを出さなくするにはどうしたら良いでしょうか。 ご回答をよろしくお願いします。

  • C言語 ?のついた処理内容

    C言語初心者です。 FFTの勉強をしようと先人の作ったC言語プログラムを 参考に処理内容を勉強中ですが、以下の文が どのような処理を行っているのか理解できません。 ご存知の方たいへんおてすうですが、処理内容を ご教授をお願いします。 よろしくお願いします。  w = (flag? M_PI: -M_PI) / (double)n;

  • javaでC++のdefine文に相当する記述

    毎度、お世話になります。 VC++では、#define文があります。 javaでdefine文に相当する記述について質問します。 javaでは、PIの場合は下記のimport文を記述しますと、 下記の如く、aにPIの値を代入できると思います。 ======================== import static java.lang.Math.PI; static public double a=PI; ======================== Q1) 自分用のpackageを作成して、例えば、この中にPI4即ち、PI*4を設定する方法を   お教え頂けますと大変あり難いです。 以上、宜しくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう