スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

constとstatic readonlyの違い。

今更ながら迷ってしまった実装、「const」と「static readonly」。
いずれも定数定義に使われる。定数定義の目的は、マジックナンバーや、文字列定数入力ミスの削減にある。どっちを使うか迷うんだ。大して違わない?と思うから。
調べてみると、結構違う事がわかった。
readonlyとconstの使い分けより、両者の違いを箇条書きで。
constはコンパイル時に値がそのまま埋め込まれる。
 →実行速度は速くなる。でも、サイズは増える。
 →switch文や、デフォルト引数に使える。
 →アセンブリ(*.dll)を入れ替えても、参照するアセンブリ側に変更した値は使用されない。
・static readonlyは、アセンブリロード時に適用される。
 →変数は共有されるので、constに比べサイズは小さくなる。
 →switch文や、デフォルト引数には使えない。
 →アセンブリ(*.dll)を入れ替えれば、ロードし直され、変更した値が使用される。
そういえば、埋め込みやったなぁ、と今更思ってしまった。
確認目的で以下のようなクラスを作る。

public static class ConstantsDefine {

public const string STR_CONST = "定数文字列";

public const int INT_CONST = 11;

public const decimal DEC_CONST = 100M;
}

public static class StaticReadonlyDefine {

public static readonly string STR_CONST = "定数文字列";

public static readonly int INT_CONST = 11;

public static readonly decimal DEC_CONST = 100M;
}


そして、これを実際に使う。

var srStr= string.Format("{0}定数を使う", StaticReadonlyDefine.STR_CONST);
var srInt = StaticReadonlyDefine.INT_CONST + 1;
var sreDcimal = StaticReadonlyDefine.DEC_CONST + 1;

var str1 = srStr + srInt.ToString() + sreDcimal.ToString();

var cnstStr= string.Format("{0}定数を使う", ConstantsDefine.STR_CONST);
var cnstInt = ConstantsDefine.INT_CONST + 1;
var cnstDcimal = ConstantsDefine.DEC_CONST + 1;

var str2 = cnstStr + cnstInt.ToString() + cnstDcimal.ToString();

実行結果(str1とstr2)は同じ。この実装を持つアセンブリをILSpyで覗いてみた。

// TawamureDays.MainWindow
string srStr = string.Format("{0}定数を使う", StaticReadonlyDefine.STR_CONST);
int srInt = StaticReadonlyDefine.INT_CONST + 1;
decimal sreDcimal = ++StaticReadonlyDefine.DEC_CONST;
srStr + srInt.ToString() + sreDcimal.ToString();

string cnstStr = string.Format("{0}定数を使う", "定数文字列");
int cnstInt = 12;
decimal cnstDcimal = 101m;
cnstStr + cnstInt.ToString() + cnstDcimal.ToString();

たしかに、埋め込みやなぁ。というのが確認できた。
計算して、定数化してるし(100M + 1ではなく、101Mで埋め込まれている)。
処理は速くなるかもしれんけど、インスタンス数の削減になるかどうかは怪しいなぁ。
というわけで、デフォルト引数やswitch文に使われない限りは、static readonlyで宣言することにしよう。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。