c# - C# 如果数组通过引用传递,为什么必须使用修饰符 ref 传递参数数组?
问题描述
我不明白为什么这个函数是这样写的:
System.Array.Resize<int>(ref int[], int)
如果数组默认通过引用传递,为什么不这样写:
System.Array.Resize<int>(int[], int)
解决方案
这是因为当我们将变量写入引用类型对象时,有 2 个部分,实际对象实例和变量名称所代表的引用(内部 32 位或 64 位内存地址指针,取决于平台)。您可以通过这个 sharplab.io 片段清楚地看到这一点。
当我们调用一个方法时,这个指针会被复制,但实例不会,所以:
var a = new Blah {Prop = "1"}; // Blah is a class, a reference type
Method(a);
void Method(Blah blah)
{
blah.Prop = "2"; // changes the shared instance, we know this.
blah = new Blah {Prop = "3"}; // has no effect.
}
Console.WriteLine(a.Prop); // 2
您会看到,当我们blah
在方法内部进行设置时,我们正在改变本地引用,而不是共享引用。现在如果我们使用ref
关键字:
var a = new Blah {Prop = "1"};
Method(ref a);
void Method(ref Blah blah)
{
blah.Prop = "2"; // changes the shared instance, we know this.
blah = new Blah {Prop = "3"}; // now changes ref a outside
}
Console.WriteLine(a.Prop); // 3!
因为参数blah
是通过引用传递的,所以当我们改变它时,我们改变了原来的引用a
。
推荐阅读
- python - 将代理传递给 Seaborn
- html - 如何防止用户在使用“contenteditable”时编辑或删除 ::before 的内容?
- r - 根据最大距离从距离矩阵中提取
- angular - 迭代Angular中的项目时与syncfusion图表的行为不一致
- php - 将请求对象转换为数组以进行数据库插入
- android - 为什么不使用具有相同方向的嵌套 RecyclerView
- websphere - 未找到 IBM Websphere 9.0 JMS 授权文件
- python - Python多处理池地图/星图不执行
- javascript - 如何在右箭头单击时将表格水平滚动到最后一个 td?
- python - 使用 python 3.4 导入阿拉伯语 Wordnet