[Effective C#] 項目2 const よりも readonly を使用する

本日で Effective C# の復習も二日目です。

って、項目50 まであるんですな。More Effective C# もあるから、毎日頑張っても三カ月以上かかるのか…。気が遠い。(笑)

まあ、「項目2 const よりも readonly を使用する」です。

// 定数で宣言。
public const int MaxValue = 15;

// readonly フィールドで宣言。
public static readonly int MaxValue = 15;

の違いについてです。(実際には、「項目1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること」の通り、フィールドではなく、static プロパティを使う方がいいと思います)

両者ともよく似ていますが、const はコンパイル時にアセンブリに値が直接埋め込まれます。つまりは別アセンブリの定数を利用するのは危険だということです。

例えば、先ほどの例のコードが AssemblyA.dll に、次のコードが AssemblyB.dll にあるとします。

if (value > Sample.MaxValue) { throw new InvalidArgumentException(); }

そして、MaxValue の値を 20 に書き換えて、AssemblyA.dll を差し替えます。

定数の場合は MaxValue の値は 15 として AssemblyB.dll に埋め込まれています。ですので、新しい AssmeblyA.dll を利用して、AssemblyB.dll を作り直さない限り、20 にはなりません。

変数の場合は AssemblyA.dll を差し替えるだけで、問題ありません。

私はこういう状況になったことはないんですが、はまったときに原因不明になりやすいので、const を避けた方がよいというのに賛成です。

ちなみに、実行速度は定数の方が上です。ですので、

高いパフォーマンスが求められていて、なおかつ将来にわたって変更されることがないことが明らかな場合にのみコンパイル時定数を使用するべきです。

というわけです。実際、.NET Framework でも公開メンバで const ってほとんどないんじゃないかなあ。

コメントを追加

Filtered HTML

  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <img>
  • 次のタグを使用してソースコード構文をハイライトすることができます。: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby> The supported tag styles are: <foo>, [foo].
  • 行と段落は自動的に折り返されます。

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
イメージ CAPTCHA
Enter the characters shown in the image.
エラー | まさくらのブログ

エラー

サイトに予期せぬエラーが起こりました。しばらくたってから再度お試しください。