C#では、以下のシグネチャを持つ関数が与えられます
public static void Foo(ref int x, ref int y)
関数がを使用して呼び出された場合
int A = 10;
Foo(ref A, ref A)
関数Fooの内部で、x引数とy引数が同じ変数を参照していることをテストできますか?xとyの単純な同等のテストは、2つの異なる変数が同じ値を持つ場合にも当てはまるため、十分ではありません。
C#では、以下のシグネチャを持つ関数が与えられます
public static void Foo(ref int x, ref int y)
関数がを使用して呼び出された場合
int A = 10;
Foo(ref A, ref A)
関数Fooの内部で、x引数とy引数が同じ変数を参照していることをテストできますか?xとyの単純な同等のテストは、2つの異なる変数が同じ値を持つ場合にも当てはまるため、十分ではありません。
安全でないコードを使用する場合は、基になる変数アドレスを比較できます。
public static bool Foo(ref int a, ref int b)
{
unsafe
{
fixed (int* pa = &a, pb = &b)
{
// return true iff a and b are references to the same variable
return pa == pb;
}
}
}
unsafe
( @Michael Graczykのコメントに基づいて、メソッドシグネチャから削除するように編集されました。)
とが同じオブジェクトへの参照であるObject.ReferenceEquals(x, y)
かどうかを判断するために使用できます。x
y
編集:Kirk Woll( MSDNのこの記事で確認)が指摘したように、このメソッドは値型では機能しません(ボクシングのため)。これを回避するには、メソッドのパラメータータイプをからに変更しますint
(object
もちろん、これは、object
変数をメソッドに渡す必要があることを意味します。ただし、これは引き続き可能int
です)。
つまり、メソッドは次のようになります。
public static void Foo(ref object x, ref object y) {
Console.WriteLine("x and y the same ref: {0}", Object.ReferenceEquals(x, y));
}
そしてそれを呼び出す:
object A = 10;
Foo(ref A, ref A);
結果として"x and y are the same ref: True"