定数の値はコンパイル時にDLLに埋め込まれます。これによりどのような問題が発生するのか典型的な例で説明します。
まずはApp.UI.CoreというDLLに定数が定義されているとしましょう。以下のように定義がされているとします。
App.UI.Core
public const Int32 MaxRecordCount = 20;
画面ではこの定数を使用したコードがあるとします。
App.UI.Page1
private void CreateTable()
{
for (int i = 0; i < MaxRecordCount; i++){ //...Do something }
}
App.UI.CoreのDLLで定義されている定数の値はコンパイル時にApp.UI.Page1のDLLの中に埋め込まれます。
変数の値を読みに行くのではなく20という値がApp.UI.Page1のDLLの中に埋め込まれることになります。
ですので上記のコードは以下のようにコンパイルされます。
App.UI.Page1
private void CreateTable()
{
for (int i = 0; i < 20; i++){ //...Do something }
}
20という値が遠い未来においても変化しないのであれば何の問題も発生しません。
しかし顧客からの要求によってこの数字を変更してくれと言われ変更することになりました。
App.UI.Coreのソースコードを変更し20という値を50に変更してコンパイルしてDLLを入れ替えました。
しかしながらこれだけではApp.UI.Page1のDLLに埋め込まれた20という値は変わりません。
変更するためには再度App.UI.Page1のDLLをコンパイルしなおす必要があります。
このように定数を使用すると変更があった場合に参照しているDLLを全てコンパイルする必要が出てきます。
画面が400画面ほどある場合を考えるとそのコストは膨大なものになります。
定数を使用する場合は本当に定数のもの、例えば円周率とかInt32のMaxValueとか将来変更される可能性が限りなく0%に近いものに対して使用するようにしましょう。