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 的简单等效测试是不够的,因为在两个不同变量具有相同值的情况下也是如此。

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 回答