これは、例で最もよく示されています。
public class C { public int P { get; set; } }
public class X
{
static void M(C c1, C c2, ref C c3, ref C c4)
{
c1.P = 11;
c2 = new C() { P = 12 };
c3.P = 13;
c4 = new C() { P = 14 };
}
static void Main()
{
C q1 = new C() { P = 1 };
C q2 = new C() { P = 2 };
C q3 = new C() { P = 3 };
C q4 = new C() { P = 4 };
M(q1, q2, ref q3, ref q4);
Console.WriteLine(q1.P);
Console.WriteLine(q2.P);
Console.WriteLine(q3.P);
Console.WriteLine(q4.P);
}
}
何が起こるのですか?
q1とc1は同じオブジェクトを参照しますが、変数は異なります。c1.Pを変更すると、両方の変数が同じオブジェクトを参照するため、q1.Pが変更され、q1は11になります。
q2とc2は同じオブジェクトを参照しますが、変数は異なります。c2とq2は異なる変数であるため、c2を変更してもq2は変更されません。一方を変更しても、もう一方は変更されません。q2は2のままで、新しいオブジェクトは失われます。
q3とc3は同じ変数の2つの名前であるため、同じオブジェクトを参照します。同じものの2つの名前であるため、q3.Pを自動的に変更するc3.Pを変更すると。
q4とc4は同じ変数の2つの名前であるため、q4を変更するとc4も変更されます。
それは理にかなっていますか?
「この変数のエイリアスを作成する」のキーワードが「ref」であるのは残念です。それが「エイリアス」であったなら、それはもっと明確だっただろう。
2番目の質問に答えるには:いいえ、これは一連の参照を作成しません。より明確な例を見てみましょう。
...
int c1 = 123;
M(ref c1);
...
void M1(ref int q1) { M2(ref q1); }
void M2(ref int q2) { M2(ref q2); }
つまり、c1とq1は同じ変数の異なる名前であり、q1とq2は同じ変数の異なる名前であるため、c1、q1、およびq2はすべて相互のエイリアスです。C ++のように、C#には「変数への参照への参照」はありません。