Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试C#ref参数是否引用同一项_C# - Fatal编程技术网

如何测试C#ref参数是否引用同一项

如何测试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所指出的(在上一篇文章中确认

在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所指出的(在上一篇文章中确认),此方法不适用于值类型(由于装箱)。您可以通过将方法上的参数类型从
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
进行编译,否则这是正确的方法。另外,drf
Foo
不需要是不安全的,因为它的返回值和任何形式都不是不安全的类型。您可以将
fixed
块放在
unsafe
块中。@Michael Graczyk I更新了答案,因此该方法不会被声明为不安全的。谢谢你的建议。你的潜在问题是什么?如果别名导致问题,则只需对副本进行操作,并在最后一步更新参数。副本不会是别名。