C#で値を変化しない値を意味するconst(定数)を解説

これまでの連載では「変数」という単語はたくさん出てきました。この変数は「変わる数」と書いているとおり、様々な値を格納したり取り出したりすることができます。それに対して「変わらない数」というのもあります。

プログラミングではこうした「変わらない数」を「定数」と呼んでいます。定数とは定められた数と書くように、プログラミングで定義して使用することはできますが、値の代入・再代入をすることができません。C#における「定数」について、その基礎から使い方までをサンプルコードを交えて解説していきます。

定数とは

「定数」とは、概要でも書いている通り変わらない数として定義されるものです。つまり再代入も不可であるため、変数とは性質の異なる値になります。英語では「Constant」と呼ばれています。

C#では「const」と略して記述することが多いです。変数は値の使用方法が多様でしたが、定数の使い方は割と限定されています。定数を使用する場面は主に「設定値」や「固定化された数値」を対象に設定するのが一般的です。

例えば「消費税率」や「最大・最小」などは、変わることは少ないので定数にしておくほうが良いでしょう。定数にしておくことで値に名称が付けられますし、値を一か所で管理できるようになるからです。

定数の使い方

それでは定数の使い方を実際のサンプルコードを書きながら解説していきます。定数の使い方を確認するために、新規のコンソールアプリケーションを作成して、以下を記述してみましょう。

using System;

namespace App29
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("商品の価格を入力してください。(小数点を含んだ値で返します)");
            int price = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine();

            //税込み価格の算出
            double priceIncludesTax = CalcIncludeTax(price);

            Console.WriteLine("税込み価格:" + priceIncludesTax + "円");
            Console.ReadLine();
        }

        //定数:税率(注:仮に8%としている)
        const double TaxRate = 0.08;

        //税込み価格を計算するメソッド
        static double CalcIncludeTax(int price)
        {
            //価格を変換して税込み価格を計算する
            return Convert.ToDouble(price) * (1 + TaxRate);
        }
    }
}

定数を宣言しているのは以下の箇所になります。定数はconstキーワードを使用します。constキーワードのあとに型を記述して定数名を書き、そのあとに値を設定します。

//定数:税率(注:仮に8%としている)
const double TaxRate = 0.08;

定数を使用するメリットは「改修が簡単になる」という点だと考えています。例えば、メソッドを以下のように記述していた場合に税率が10%に変更となったら修正する箇所を見つけるのが大変ですよね。

//価格を変換して税込み価格を計算する
return Convert.ToDouble(price) * (1 + 0.08);

しかも、このように数値を使っている箇所があちらこちらに散らばっていたら、修正のし忘れが発生するかもしれません。そうした事象を押さえるために定数を使うのです。上記のメソッドの中にある0.08をTaxRateという定数にしておくことで、10%に変わったらTaxRateの値を0.1にするだけで修正が完了します。

定数クラスが一般的

定数をアプリケーションで使用する場合は、個別に定数用のクラスを作成することが一般的になります。なぜなら定数を集めておく方が、一括で値の変更を管理することができるからです。ということで、新規のコンソールアプリケーションを作成していきます。

とりあえず新規のクラスを追加します。名前は「Constants.cs」としています。定数が「Constant」なので、複数おけるように名前も複数形にしています。Constants.csにはConstantsクラスを作成しますが、この時はインスタンス化が不要である「static」キーワードを付与します。

namespace App30
{
    //定数クラス
    public static class Constants
    {
        //税率の定数
        public const double TaxRate = 0.08;
    }
}

定数クラスは「public static class Constants」で定義し、1つ前のアプリケーションと同様に税率を定数として配置しておきます。これで定数クラスの準備は完了となります。

定数クラスが準備できたので、次はProgram.csを書いていきます。以下を参考に作成してみましょう(とはいっても1つ前のアプリケーションとほぼ変わりません)。

using System;

namespace App30
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("商品の価格を入力してください。(小数点を含んだ値で返します)");
            int price = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine();

            //税込み価格の算出
            double priceIncludesTax = CalcIncludeTax(price);

            Console.WriteLine("税込み価格:" + priceIncludesTax + "円");
            Console.ReadLine();
        }

        //税込み価格を計算するメソッド
        static double CalcIncludeTax(int price)
        {
            //価格を変換して税込み価格を計算する
            return Convert.ToDouble(price) * (1 + Constants.TaxRate);
        }
    }
}

定数クラスから定数を呼び出しているのは「Constants.TaxRate」の箇所になります。1つ前のアプリケーションからは、以下の記述がProgram.csから無くなっているのが分かると思います。

//定数:税率(注:仮に8%としている)
const double TaxRate = 0.08;

上記の内容をConstants.csに配置しています。特に税率のようなものは、クラス内で定義するよりも、アプリケーション内で共通で使用され得る「共通な定数値」だと考えられるため、Program.csとは切り離されたConstants.csに記述するほうが良いですね。

他のクラスやファイルでも税率を使う場合に、もしクラス内に記述していたら「TaxRate」の定数が大量に定義されてしまします。そうならないためにも、共通で使いまわすような定数は定数クラスに収めるほうが効率はよくなります。

なお、特定のクラスやファイル固有の値であるならば、定数クラスに盛り込む必要はないと考えていますので、「共通して使えそうか?」という観点が定数クラスにするかどうかの判断となるでしょう。