プログラミング.NET FRAMEWORK 第3版 (マイクロソフト公式解説書)

プログラミング.NET FRAMEWORK 第3版 (マイクロソフト公式解説書)

  • 作者: Jeffrey Richter,藤原雄介
  • 出版社/メーカー: 日経BP社
  • 発売日: 2011/02/03
  • メディア: 単行本
  • 購入: 10人 クリック: 500回
  • この商品を含むブログ (20件) を見る
電車の中で読んでました。定数とフィールドの扱い。はっきり意識していませんでした(C流にまずconst考えてしまっていました)が、constとreadonlyの違いはちゃんと意識しないといけないですね。
具体的には厳密名がついていないアセンブリの場合、constはコンパイル時に畳み込まれてしまうため、constを定義していないdllがなくても動いてしまいます*1。
したがって、こんな状況でよろしくない。

  • ソリューションAにあるクラスA1でpublic const int hoge = 5とか定義されている
  • ソリューションBにあるクラスB1でクラスA1のhogeを参照する。
  • ソリューションA側のhogeの定数を変えても、普通にVSで生成しているだけでは、クラスB1側ではクラスA1の変更がわからない(なくても動いてしまう)ので、誤った動作をしてしまう…と。

一つのソリューションだけでやっていた場合、Visual Studioがソースコードの変更をちゃんと検知して、関連ビルドしてくれる(はず)ので、問題ないでしょうけど、気を付けたいですね。こういうときはreadonlyを使いましょうということが書かれています。
C#でのコンストラクターでの挙動はC++と異なるので、気を付けたいところですね。ええ、構造体のコンストラクター書くときによくC#コンパイラに怒られてます…。

*1:現実にはアセンブリにconstのフィールドだけってことはないでしょうけど