今回は 読み取り専用メンバー 。名前からでは機能が分からないですね。確認して行きましょう。
公式はこちら
このブログでの目次?はこちら
■ メソッドに 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' がこの項目に対して有効ではありません。