[C# クラス] readonlyで読み取り専用のフィールドを定義する

クラス定義のフィールド宣言にreadonly キーワードを付けると読み取り専用のフィールド(クラスメンバーの変数のこと)にすることができます。プログラム実行中に値を変更されたくないときに使います。

同じようにconstキーワードを付けた定数も値の変更ができませんが、constに設定できる値はリテラル(10や”abc”など直接コード書いたもの)だけになります(new が使えない)。

スポンサーリンク

readonlyの使い方

readonlyを指定した読み取り専用のフィールドは宣言時コンストラクタの中だけで値を設定することができます。

コンストラクタについては、[C# プログラミング入門] クラスメンバーについて(コンストラクター)を見てください。

using System;
class Program
{
    public static void Main()
    {
        // クラスのオブジェクトを作成
        SampleClass cls = new SampleClass(999);

        // readonlyが付いたパブリックフィールドは外部からの変更できない
        // cls.field2 = 123;
        // SampleClass.field3 = 456;

        // クラスのメソッドを実行
        cls.Method1();
        Console.WriteLine($"field2 = {cls.field2}");
        Console.WriteLine($"field3 = {SampleClass.field3}");
    }
}

class SampleClass
{
    // 読み取り専用のプライベートフィールド
    readonly int field1;

    // 読み取り専用のパブリックフィールド
    readonly public int field2 = 10;

    // 読み取り専用の静的パブリックフィールド
    readonly public static int field3 = 20;

    // コンストラクタ
    public SampleClass(int value)
    {
        // 読み取り専用のプライベートフィールドの値を設定
        this.field1 = value;
    }

    public void Method1()
    {
        // 宣言時、コンストラクタ以外では値を代入できない
        // this.field1 = 10;
        // this.field2 = 10;
        // SampleClass.field3 = 10;

        // プライベートフィールドを表示
        Console.WriteLine($"field1 = {this.field1}");
    }
}
field1 = 999
field2 = 10
field3 = 20
スポンサーリンク

参照型をreadonlyにするときの注意

参照型にreadonlyを付けた場合に読み取り専用になるのはオブジェクトへの参照情報になります。参照先オブジェクトのメンバーなどは変更することができるので注意が必要です。

using System;
class Program
{
    public static void Main()
    {
        // SampleClassオブジェクトを作成
        SampleClass cls = new SampleClass();

        // クラスメンバーの値を表示
        Console.WriteLine($"Sub.Data1={cls.Sub.Data1}, Sub.Data2={cls.Sub.Data2}");

        // 新しいオブジェクトへの参照は設定できない
        // cls.Sub = new SubClass();

        // 参照先のメンバーは書き換えることが出来る
        cls.Sub.Data1 = 100;
        cls.Sub.Data2 = 200;

        // クラスメンバーの値を表示
        Console.WriteLine($"Sub.Data1={cls.Sub.Data1}, Sub.Data2={cls.Sub.Data2}");
    }
}

class SampleClass
{
    // 読み取り専用の参照型のパブリックフィールド
    readonly public  SubClass Sub = new SubClass();
}

class SubClass
{
    public int Data1 = 10;
    public int Data2 { get; set; } = 20;
}
Sub.Data1=10, Sub.Data2=20
Sub.Data1=100, Sub.Data2=200

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました