如何测试C#ref参数是否引用同一项
在C#中,给定一个具有以下签名的函数如何测试C#ref参数是否引用同一项,c#,C#,在C#中,给定一个具有以下签名的函数 public static void Foo(ref int x, ref int y) 如果函数是使用 int A = 10; Foo(ref A, ref A) 在函数Foo中,是否可以测试x和y参数引用相同的变量?对x和y进行简单的等效测试是不够的,因为在两个不同变量具有相同值的情况下也是如此 您可以使用Object.ReferenceEquals(x,y)来确定x和y是否是对同一对象的引用 编辑:正如Kirk Woll所指出的(在上一篇文章中确认
public static void Foo(ref int x, ref int y)
如果函数是使用
int A = 10;
Foo(ref A, ref A)
在函数Foo中,是否可以测试x和y参数引用相同的变量?对x和y进行简单的等效测试是不够的,因为在两个不同变量具有相同值的情况下也是如此 您可以使用
Object.ReferenceEquals(x,y)
来确定x
和y
是否是对同一对象的引用
编辑:正如Kirk Woll所指出的(在上一篇文章中确认),此方法不适用于值类型(由于装箱)。您可以通过将方法上的参数类型从int
更改为object
(当然,这意味着您还必须将object
变量传递给该方法-但这仍然可以是int
)
i、 e.该方法变为:
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和y是相同的ref:True”
如果您愿意使用不安全的代码,您可以比较基础变量地址:
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;
}
}
}
(根据@Michael Graczyk的评论,编辑以从方法签名中删除
不安全的。即使引用相同的变量,也将返回false。(引用相等对int和其他原语没有意义)来自MSDN:“Object.ReferenceEquals总是为值类型返回false”这将返回误报。考虑:objecta=newobject();对象b=a;Foo(参考a、参考b)
这声明x和y是相同的ref,但它们不是。除非您绝对无法使用/safe
进行编译,否则这是正确的方法。另外,drfFoo
不需要是不安全的,因为它的返回值和任何形式都不是不安全的类型。您可以将fixed
块放在unsafe
块中。@Michael Graczyk I更新了答案,因此该方法不会被声明为不安全的。谢谢你的建议。你的潜在问题是什么?如果别名导致问题,则只需对副本进行操作,并在最后一步更新参数。副本不会是别名。