Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

ライブラリの外部に公開する値に定数を使ってはいけない

ライブラリの外部に公開する値に定数(列挙体も含む)を使ってはいけません。ビルド時に定数の値が直接埋め込まれるからです。

つまり、Hoge.dllのFuga定数をFoo.dllで参照している場合、Fuga定数の値を変更してHoge.dllを再ビルドしてもFoo.dllで参照しているFuga定数の値には変更が反映されません。

この件はMSの「クラスライブラリ開発のデザイン ガイドライン」に記載があります。

変更されない定数には、定数フィールドを使用してください。たとえば、 Math クラスでは、 E と PI を静的定数として定義します。コンパイラは、const フィールドの値を呼び出し元のコードに直接挿入します。そのため、const 値を変更すると、必ず互換性に関係する問題が生じます。

フィールドのデザイン
フィールドは、オブジェクトに関連付けらたデータを保持します。 ほとんどのシナリオで、ライブラリの非静的フィールドは、開発者に対して参照可能にしないでください。 以下のガイドラインに従うと、ライブラリのデザインでフィールドを正しく使用できます。 ...