rksoftware

Visual Studio とか C# とかが好きです

C# 8 の確認 - 読み取り専用メンバー

今回は 読み取り専用メンバー 。名前からでは機能が分からないですね。確認して行きましょう。

公式はこちら

このブログでの目次?はこちら

■ メソッドに readonly を付けられる

これまではこんな感じでした。

public override string ToString() => "";

これからはこんな感じにも書けます。

public readonly override string ToString() => "";

■ うれしい事一つ目

次のコードがエラーになります。X を変更するコードが書けません。

public struct Point
{
    public double X { get; set; }

    public readonly override string ToString()
    {
        X += X;
        return "";
    }
}

エラー CS1604 読み取り専用であるため 'X' に割り当てできません

■ うれしい事二つ目

次のコードが警告になります。readonly メソッドの中で、readonly でない getter を呼ぶと警告になります。

public struct Point
{
    double _x;
    public double X { get => _x; set => _x = value; }

    public readonly override string ToString()
    {
        Console.WriteLine(X);
        return "";
    }
}

警告 CS8656 'readonly' メンバーから readonly 以外のメンバー 'Point.X.get' を呼び出すと、'this' の暗黙のコピーが生成されます。

プロパティの getter に readonly にすると警告がなくなります。

public double X { readonly get => _x; set => _x = value; }

当然ですが、次のコードはエラーです。

public readonly double X { get => _x; set => _x = value; }

エラー CS1604 読み取り専用であるため '_x' に割り当てできません

自動実装プロパティの getter は警告になりません。

public double X { get; set; }

メソッドを readonly にしなかった場合

こんなコードで変数 point のコピーが生まれます

static void Test(in Point point)
{
    var text = point.ToString();
}

クラスには付けられない

この機能は構造体の機能なのでクラスに書くとエラーです。

public class PointC
{
    public double X { get; set; }
    
    public readonly override string ToString()
    {
        Console.WriteLine(X);
        return "";
    }
}

エラー CS0106 修飾子 'readonly' がこの項目に対して有効ではありません。