public
な const
を定義するのはやめよう
const
で定義した変数をアセンブリ外に公開すると「const のバージョニング問題」と言われる問題が発生します。
どういうことかと言うと...
クラスライブラリ Sub.dll に const
で TAX
(消費税率)が定義されていたとします。
public class AppConstants
{
public const double TAX = 5D;
}
Sub.dll を参照して、アプリケーション MyApp.exe を作成したとします。
class Program
{
static void Main(string[] args)
{
...略
var includeTax= price * AppConstants.TAX;
}
}
この後、AppConstants
の TAX
を 8
に変更し Sub.dllだけ差し替えました。
しかし、AppConstants.TAXの値は 5
のままです。
定数は、コンパイル時にリテラルと全く同じように値が展開されてしまうため、 定数を定義しているライブラリの方だけでなく、参照しているアプリ側も再コンパイルしないと、値の変化が反映されません。
参考: C# によるプログラミング入門 [基礎] 定数
定数を公開するときはstatic readonly
を使うとよいです。
readonly
で定義した値は実行時に参照されます。
そのためSub.dllだけを差し替えるだけで正しく動作します。
public class AppConstants
{
public static readonly double TAX = 5;
}
Enum
の代わりに const
を使うのをやめよう
Enum
の代わり const
を使用すると意図せぬ値が入った場合でもビルドが通っていしまいます。
struct Mode
{
public const int CREATE = 0;
public const int READ = 1;
public const int UPDATE = 2;
public const int DELETE = 3;
}
...略
// 意図通りのコード
var mode = Mode.READ;
// 想定外の値も入ってしまう!
mode = 4;
列挙型(enum
)を使えば、CREATE
,READ
,UPDATE
,DELETE
以外の値は入りません。
enum Mode
{
CREATE = 0,
READ = 1,
UPDATE = 2,
DELETE = 3,
}
...略
var mode = Mode.READ;
// ビルドエラー!!
mode = 4;
const
ではうっかり間違った値を入れても気づきにくいですが、enum
ならIDEがミス教えてくれるので安心です!。