在 C# 中,给定一个具有以下签名的函数
public static void Foo(ref int x, ref int y)
如果函数是使用
int A = 10;
Foo(ref A, ref A)
在函数 Foo 内部是否可以测试 x 和 y 参数引用相同的变量?x 和 y 的简单等效测试是不够的,因为在两个不同变量具有相同值的情况下也是如此。
在 C# 中,给定一个具有以下签名的函数
public static void Foo(ref int x, ref int y)
如果函数是使用
int A = 10;
Foo(ref A, ref A)
在函数 Foo 内部是否可以测试 x 和 y 参数引用相同的变量?x 和 y 的简单等效测试是不够的,因为在两个不同变量具有相同值的情况下也是如此。
如果你愿意使用不安全的代码,你可以比较底层的变量地址:
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"