オブジェクトを渡すときに「ref」キーワードを使用するのはなぜですか? 質問する

オブジェクトを渡すときに「ref」キーワードを使用するのはなぜですか? 質問する

オブジェクトをメソッドに渡す場合、なぜ ref キーワードを使用する必要があるのでしょうか? いずれにしても、これがデフォルトの動作ではないのでしょうか?

例えば:

class Program
{
    static void Main(string[] args)
    {
        TestRef t = new TestRef();
        t.Something = "Foo";

        DoSomething(t);
        Console.WriteLine(t.Something);
    }

    static public void DoSomething(TestRef t)
    {
        t.Something = "Bar";
    }
}


public class TestRef
{
    public string Something { get; set; }
}

出力は「Bar」で、これはオブジェクトが参照として渡されたことを意味します。

ベストアンサー1

refオブジェクトの内容を変更する場合は、を渡します。

TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);

void DoSomething(ref TestRef x)
{
  x = new TestRef();
  x.Something = "Not just a changed TestRef, but a completely different TestRef object";
}

DoSomething を呼び出した後、tは元の を参照せずnew TestRef、まったく異なるオブジェクトを参照します。

これは、 a などの不変オブジェクトの値を変更する場合にも便利です。 a は、一度作成されるとstring値を変更することはできません。ただし、 a を使用すると、文字列を別の値を持つ文字列に変更する関数を作成できます。stringref

ref必要でない限り、使用するのは得策ではありません。 を使用するとref、メソッドは引数を他のものに変更する自由が与えられますが、メソッドの呼び出し側は、この可能性を確実に処理できるようにコーディングする必要があります。

また、パラメータ タイプがオブジェクトの場合、オブジェクト変数は常にオブジェクトへの参照として機能します。つまり、 キーワードrefを使用すると、参照への参照が得られます。これにより、上記の例で説明したような操作を実行できます。ただし、パラメータ タイプがプリミティブ値 (例int) の場合、このパラメータがメソッド内で に割り当てられると、渡された引数の値はメソッドが返された後に変更されます。

int v = 1;
Change(ref v);
Debug.Assert(v == 5);
WillNotChange(v);
Debug.Assert(v == 5); // Note: v doesn't become 10

void Change(ref int x)
{
  x = 5;
}

void WillNotChange(int x)
{
  x = 10;
}

おすすめ記事