为什么 "return ref a[0]" 不改变原来的数组?
why "return ref a[0]" doesn't change the original array?
我打算return引用一个数组中的值(并对其进行操作),但是,当我在 method() 中传递数组时,结果不是我想要的。
而且我也很好奇我不能使用DEBUG监视器来查询method()
堆栈中&a
的地址。
谁能帮助我正确使用 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];
}
发生这种情况是因为 q
不是本地引用。它只是一个常规变量。你也没有在方法调用之前说 ref
,所以这只是一个常规的按值赋值。由于这些原因,q
不是 a[0]
.
的别名
documentation给出了类似的例子:
Assume the GetContactInformation
method is declared as a ref return
:
public ref Person GetContactInformation(string fname, string lname)
A by-value assignment reads the value of a variable and assigns it to a new variable:
Person p = contacts.GetContactInformation("Brandie", "Best");
The preceding assignment declares p
as a local variable. Its initial value is copied from reading the value returned by GetContactInformation
. Any future assignments to p
will not change the value of the variable returned by GetContactInformation
. The variable p
is no longer an alias to the variable returned.
要解决此问题,您可以在 var
之前添加 ref
以使 q
成为本地引用,并在调用之前添加 ref
使其成为 by -ref 赋值:
ref var q = ref method(ref s);
我打算return引用一个数组中的值(并对其进行操作),但是,当我在 method() 中传递数组时,结果不是我想要的。
而且我也很好奇我不能使用DEBUG监视器来查询method()
堆栈中&a
的地址。
谁能帮助我正确使用 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];
}
发生这种情况是因为 q
不是本地引用。它只是一个常规变量。你也没有在方法调用之前说 ref
,所以这只是一个常规的按值赋值。由于这些原因,q
不是 a[0]
.
documentation给出了类似的例子:
Assume the
GetContactInformation
method is declared as aref return
:public ref Person GetContactInformation(string fname, string lname)
A by-value assignment reads the value of a variable and assigns it to a new variable:
Person p = contacts.GetContactInformation("Brandie", "Best");
The preceding assignment declares
p
as a local variable. Its initial value is copied from reading the value returned byGetContactInformation
. Any future assignments top
will not change the value of the variable returned byGetContactInformation
. The variablep
is no longer an alias to the variable returned.
要解决此问题,您可以在 var
之前添加 ref
以使 q
成为本地引用,并在调用之前添加 ref
使其成为 by -ref 赋值:
ref var q = ref method(ref s);