オブジェクトをメソッドに渡す場合、なぜ 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 を使用すると、文字列を別の値を持つ文字列に変更する関数を作成できます。string
ref
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;
}