首页 > 解决方案 > 为什么“return ref a[0]”不会改变原始数组?

问题描述

我计划返回数组中值的引用(并对其进行操作),但是,当我在 method() 中传递数组时,结果不是我想要的。

而且我也很好奇我不能使用DEBUG监视器来查询堆栈&a中的地址。method()

任何人都可以帮助我正确使用return ref?

static void Main(string[] args)
{

    int?[] s = new int?[5] { 1, 2, 3, 4, 5 };
    var q = method(ref s);
    q = 999;
    Console.WriteLine("s0 is " + s[0].ToString());
}

static ref int? method(ref int?[] a)
{
    a[1] = 888;
    return ref a[0];
}

标签: c#functionreferencemethod-callreturn-by-reference

解决方案


发生这种情况是因为q不是本地参考。它只是一个常规变量。您也没有ref在方法调用之前说,所以这只是一个常规的按值赋值。由于这些原因,q不是a[0].

文档给出了一个类似的例子:

假设该GetContactInformation方法被声明为ref return

public ref Person GetContactInformation(string fname, string lname)

按值赋值读取变量的值并将其分配给新变量:

Person p = contacts.GetContactInformation("Brandie", "Best");

前面的赋值声明p为一个局部变量。它的初始值是通过读取返回的值来复制的GetContactInformation。任何未来的赋值p都不会改变 . 返回的变量的值GetContactInformation。该变量p不再是返回变量的别名。

要解决此问题,您将添加refbeforevar以使qref 本地化,并ref在调用之前添加以使其成为 by-ref 分配:

ref var q = ref method(ref s);

推荐阅读