【C#】const、static、readonlyの違いと使い方

定数とは

「プログラミングにおいて定数とは、変数同様プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要な時に利用できるようにするために、データ固有の名前を与えたものである。

ただし、変数とは異なり、一度初期化するとその内容(値)を変更することはできない

よって、内容(値)が変化しないことが保証される名前が必要な時に使用される。(Wikipediaより)」

上記の内容を簡単にまとめると、定数とは「変数みたいなもので、最初に入れた値(データ)が後から変わらないもの」ということになります。

C#では、「const」を宣言することで、定数を利用できます。

 

constとは

C#で定数を宣言する時には、「const」というキーワードを使用します。

constはコンパイル時に決定する定数で、その後に値が変更されることはありません。

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/const

 

サンプルコード

using System;

namespace c_const
{
    class Program
    {
        static void Main(string[] args)
        {
            const double tax = 0.1; // constで定数の宣言

            int price = 1000;

            double result = price + (price * tax);

            Console.WriteLine(result);
        }
    }
}

実行結果:

1100

上記のように、データ型の前に「const」をつけることで定数として宣言できます。

一度、「const」で定数を宣言した後に値を変更することはできません。

constの注意点

privateな定数を「const」で宣言している時には、問題ありません。

しかし、publicな定数を「const」で宣言した際、「constのバージョニング問題」と呼ばれる問題があります。

そのため、publicな定数を宣言する時には、「readonly」というキーワードを用いて宣言することが望ましいとされています。

「constのバージョニング問題」とは、publicな定数を宣言したライブラリを別プロジェクトのプログラムから参照している場合、定数に変更があった場合には利用元、利用先どちらも再コンパイルが必要となってしまうという問題です

 

定数を宣言したい時には「enum」も使える

C#では、定数をまとめて宣言する「列挙型(enum)」と呼ばれるものが用意されています。

詳しくは、下記の記事を参考ください。

【C#】列挙型(enum)の使い方

2021.03.28

 

staticとは

static修飾子は、静的メンバ(フィールドやメソッド)を作成する際に使用します。

詳しくは、下記の記事を参考ください。

【C#】static修飾子とは

2021.03.29

 

readonlyとは

readonly」キーワードを用いると、実行時に読み取り専用の変数を宣言することができます

「readonly」キーワードは、宣言時もしくはコンストラクタ内で値の初期化・変更が可能です。

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/readonly

サンプルコード

using System;

namespace c_readonly
{
    class Sample
    {
        internal readonly string reading; // 「readonly」キーワードで読み取り専用の変数を宣言

        public Sample(string word)
        {
            reading = word;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Sample sample = new Sample("読み取り専用です"); // Sampleクラスのインスタンスを生成

            Console.WriteLine(sample.reading);
        }
    }
}

実行結果:

読み取り専用です

 

「static readonly」の組み合わせ

C#では、「static」と「readonly」を同時に使用することができます。

「static readonly」を同時に用いるメリットは以下の2つになります。
バージョニング問題が起こらない
コンパイル時に計算できない値も設定できる

サンプルコード

using System;

namespace c_static_readonly
{
    class Sample
    {
      // staticにより静的メンバのため、コンストラクタは不要
        internal static readonly string word = "static-readonlyのサンプルコードです";

    }

    class Program
    {
        static void Main(string[] args)
        {
          // インスタンスを生成せずに呼び出し可能
            Console.WriteLine(Sample.word);
        }
    }
}

実行結果:

static-readonlyのサンプルコードです

 

まとめ

const、static、readonlyの違いについて解説してきました。

constはバージョニング問題があるため、基本的には「static readonly」を使用するのが望ましいです。

実際の開発現場においても、「static readonly」の使用頻度が最も高いです。

 

おすすめ・参考書籍

■C#を学習し始めた方向け
やさしいC 第3版 (「やさしい」シリーズ)

1週間でCの基礎が学べる本

確かな力が身につくC「超」入門 第2版 (Informatics&IDEA)

■C#をある程度学習した方向け
基礎からしっかり学ぶCの教科書 改訂新版 (マイクロソフト関連書)

独習C 新版

Effective C 6.0/7.0