10

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つの異なる変数が同じ値を持つ場合にも当てはまるため、十分ではありません。

4

2 に答える 2

5

安全でないコードを使用する場合は、基になる変数アドレスを比較できます。

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のコメントに基づいて、メソッドシグネチャから削除するように編集されました。)

于 2012-07-16T01:50:31.243 に答える
4

とが同じオブジェクトへの参照であるObject.ReferenceEquals(x, y)かどうかを判断するために使用できます。xy

編集:Kirk Woll( MSDNのこの記事で確認)が指摘したように、このメソッドは値型では機能しません(ボクシングのため)。これを回避するには、メソッドのパラメータータイプをからに変更しますintobjectもちろん、これは、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"

于 2012-07-16T01:27:14.010 に答える