どーいうことか
例えば、以下のようなメソッドがあったとして
public static bool Test(ref int x, ref int y)
{
return ReferenceEquals(x, y);
}
こいつをこんな風に呼び出した
static void Main(string[] args)
{
var a = 42;
Console.WriteLine(Test(ref a, ref a));
}
コレが結果どうなるかなってお話。
結論
は、Falseになる。
値型のReferenceEqualsはFalseに成るのは当たり前と思う反面、例えば、こんな風にしたとして
public static bool Test(ref int x, ref int y)
{
x = 45;
Console.WriteLine(y);
Console.WriteLine();
return ReferenceEquals(x, y);
}
ReferenceEqualsがFalseなのに、xの値を変えたら、yも45になっていてちょいと腑に落ちない結果が出てくる。
何でこーなるのか
理由は、基本に忠実になれば簡単で、ReferenceEquals呼び出すとき、ReferenceEqualsの引数はSystem.Objectなので、当然のことながら、Boxingが発生する。
だと、引数の、”x”も”y”も、デリファレンスされて値をBoxingされることになるので、ReferenceEqualsは不一致、だけど、引数は参照渡しになっていて、しかも、今回の場合、”x”も”y”も同じ変数を参照してるので、“x”の値を変えれば、“y”も一緒に変化する。
以上、重箱の隅をつつくようなTopicでしたw