C#では変数を定数として扱うのにconstreadonlyが存在します。

「const」の方が定数としてのイメージはわきやすいですので、通常初心者用基礎本では「const」が使用されているかと思います。
今回は、これらの違いを簡単に説明してみましょう。
Unity Basic_158

【「const」と「readonly」の違い】

まず、「const」と「readonly」で定義された変数(定数)は、共に実行時に通常の変数の様に値を変更することはできません。
ですので、意味的には同じ様な定数の宣言と言えます。

では、「const」と「readonly」の違いは何でしょう。
これらは定義した変数が、定数として扱われるタイミングに違いがあります。

const:
定数として使える。コンパイル時に定数として扱う。
スクリプトに定数を直に書き込んだのと同じような感じ。

readonly:
定数として使える。プログラム実行時に定数として扱う。
スクリプト内で変数宣言時とコンストラクタ使用時に値を入力できる。


一般的には「readonly」が使われて、コンパイル時に定数が確定していなければならない場合に「const」が使われるのかと思います。
また、初心者が定数を最初に習うのは「const」なので、初心者用基礎本にある簡単なサンプルプログラムは、通常「const」を使用しています。「const」の方が定数としてのイメージはわきやすいですので。


【サンプルスクリプト】

「const」と「readonly」の使用法を理解するために以下のようなスクリプトを作成しました。
Unity Basic_159

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Const_Readonly : MonoBehaviour
{
    private const int const_Test = 1;

    void Start()
    {
        Readonly_Test_Class tmp = new Readonly_Test_Class(2);

        Debug.Log("const: " + const_Test);
        Debug.Log("readonly: " + tmp.readonly_Test);
    }
}


class Readonly_Test_Class
{
    public readonly int readonly_Test = 3;

    public Readonly_Test_Class(int test)
    {
        Debug.Log("readonly2: " + readonly_Test);
        readonly_Test = test;
    }
}


このスクリプトで「const」と「readonly」の大きな違いは、
「const」定義の「const_Test」は、宣言時に定数の固定値をスクリプト内で代入しています。
Unity Basic_160

「readonly」定義の「readonly_Test」は、宣言時に固定値をスクリプト内で代入していません。
Unity Basic_161

「readonly_Test」への固定値の代入は「readonly」の変数を含むクラスのコンストラクタが呼ばれる際です。
Unity Basic_162


次回、このスクリプトを少し変更して、それぞれの変数の動きを観察してみましょう。





Sponsored Link