refキーワードによる参照渡し

参照渡し - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


refキーワードを使えば値型でも参照で渡すことができます。

using System;

class Program {
    // refキーワードを付ける
    static void Foo(ref int i) {
        i = 9999;
    }
    
    static void Main() {
        int i = 10;
        
        // 渡すときもrefキーワードを付ける
        Foo(ref i);
        
        Console.WriteLine(i);
    }
}
$ main
9999

このとき引数を渡す側も受け取る側も両方refが必要です。

どちらかが欠けるとコンパイルエラーとなります。

また参照型の変数もrefで渡すことができます。その場合はその変数そのものを変更できます。

まずrefを使わない場合の例です。

using System;

class CClass {
    public string str;
}

class Program {
    static void Foo(CClass cobj) {
        // 変数そのものを書き換える
        cobj = new CClass { str = "bar" };
    }
    
    static void Main() {
        var cobj = new CClass { str = "foo" };
        
        // 普通に渡す
        Foo(cobj);
        
        Console.WriteLine(cobj.str);
    }
}
$ main
foo

このように書き換わりません。

しかしrefを付けると

using System;

class CClass {
    public string str;
}

class Program {
    static void Foo(ref CClass cobj) {
        // 変数そのものを書き換える
        cobj = new CClass { str = "bar" };
    }
    
    static void Main() {
        var cobj = new CClass { str = "foo" };
        
        // refで渡す
        Foo(ref cobj);
        
        Console.WriteLine(cobj.str);
    }
}
$ main
bar

と書き換わります。