rksoftware

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

C# 2.0 以降の新機能の確認 - C# 7.0 - 参照返り値と参照ローカル変数 (Ref returns and locals)

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

参照返り値と参照ローカル変数 (Ref returns and locals)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/ref-returns
 値型の参照を返り値として返すことができる。

{   // 単純な値
    // 参照を受け取って参照を返す関数
    static ref int Method(ref int arg)
    {
        arg++;
        return ref arg;
    }

    int value = 10;

    // 関数内での変更が、引数で渡した変数と返却された値の両方を変化させている(同一の参照なので)
    ref int vr = ref Method(ref value);
    Console.WriteLine($"{value}, {vr}"); // 11, 11

    // 引数で渡していた変数への変更で返却された値も変化している(同一の参照なので)
    value = 20;
    Console.WriteLine($"{value}, {vr}"); // 20, 20

    // 返却された変数への変更で引数で渡していた変数も変化している(同一の参照なので)
    vr = 30;
    Console.WriteLine($"{value}, {vr}"); // 30, 30
}
{   // 配列の要素
    // 配列を受け取って最初の要素の参照を返す関数
    static ref int Method(int[] arg)
    {
        return ref arg[0];
    }

    int[] values = { 10, 20 };
    ref int sr = ref Method(values);
    Console.WriteLine($"{values[0]}, {sr}"); // 10, 10

    // 引数で渡していた配列の最初の要素への変更で返却された値も変化している(同一の参照なので)
    values[0] = 20;
    Console.WriteLine($"{values[0]}, {sr}"); // 20, 20

    // 返却された変数への変更で引数で渡していた配列の要素も変化している(同一の参照なので)
    sr = 30;
    Console.WriteLine($"{values[0]}, {sr}"); // 30, 30
}