4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[小ネタ]ref 付き引数2つのReferenceEquals

4
Posted at

どーいうことか

例えば、以下のようなメソッドがあったとして

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?