c# - 为什么“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];
}
解决方案
发生这种情况是因为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
不再是返回变量的别名。
要解决此问题,您将添加ref
beforevar
以使q
ref 本地化,并ref
在调用之前添加以使其成为 by-ref 分配:
ref var q = ref method(ref s);
推荐阅读
- scala - Spark:列表或列表缓冲区
- ios - 重复本地通知会删除先前待处理的本地通知
- c# - 如何为要在 ASP.net 核心中下载的文件创建可下载文件链接
- swift - Post A Json object as parameter value in Swift 4 ios using Alamofire
- android - 如何指定哪些 sharedPreferences 自动备份?
- r - 用于多元 LSTM 的 keras 输入形状
- javascript - 未找到模块。“@babel/runtime/helpers/builtin/classCallCheck”无法解决
- html - 如何描述使用 CSS 创建的图像?
- javascript - Qt。从 JS 代码访问应用程序 ts 文件(上下文菜单翻译文本)
- c# - 为什么在我的 IPAddress 字符串中包含前导零时,我从 C# System.Net.IPAddress.Parse() 方法得到不同的结果?