rksoftware

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

C# 2.0 以降の新機能の確認 - C# 8.0 - 構造体型の readonly インスタンス メンバー

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

構造体型の readonly インスタンス メンバー

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/struct#readonly-instance-members
 構造体のメソッドに readonly をつけられる。(クラスにはつけられない)

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

 プロパティの値を変更するコードはエラーになる。

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

    public readonly override string ToString()
    {
        X += X;  // エラー CS1604 読み取り専用であるため 'X' に割り当てできません
        return "";
    }
}

 readonly メソッドの中で、readonly でない getter を呼ぶと警告になる。※自動実装プロパティの getter は readonly なので大丈夫

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

    public readonly override string ToString()
    {
        Console.WriteLine(X);  // 警告 CS8656 'readonly' メンバーから readonly 以外のメンバー 'Point.X.get' を呼び出すと、'this' の暗黙のコピーが生成されます。
        return "";
    }
}