247
184

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C# の const の間違った使い方をやめよう

Last updated at Posted at 2018-06-13

publicconst を定義するのはやめよう

constで定義した変数をアセンブリ外に公開すると「const のバージョニング問題」と言われる問題が発生します。
どういうことかと言うと...

クラスライブラリ Sub.dllconstTAX(消費税率)が定義されていたとします。

public class AppConstants
{
    public const double TAX = 5D;
}

Sub.dll を参照して、アプリケーション MyApp.exe を作成したとします。

class Program
{
    static void Main(string[] args)
    {
        ...
        var includeTax= price * AppConstants.TAX;
    }
}

この後、AppConstantsTAX8 に変更し 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がミス教えてくれるので安心です!。

247
184
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
247
184

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?