Alg*_*lgo 2 c# arrays function ref modifier
我不明白为什么这个函数是这样写的:
System.Array.Resize<int>(ref int[], int)
Run Code Online (Sandbox Code Playgroud)
如果默认情况下通过引用传递数组,为什么不是这样写的:
System.Array.Resize<int>(int[], int)
Run Code Online (Sandbox Code Playgroud)
这是因为当我们将变量写入引用类型对象时,有两部分,实际对象实例和变量名称代表的引用(内部为 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
Run Code Online (Sandbox Code Playgroud)
您会看到,当我们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!
Run Code Online (Sandbox Code Playgroud)
因为参数blah
是通过引用传递的,当我们改变它时,我们改变了原始引用a
。
归档时间: |
|
查看次数: |
156 次 |
最近记录: |