C# 如果数组是通过引用传递的,为什么必须使用修饰符 ref 传递参数数组?

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)

Stu*_*art 5

这是因为当我们将变量写入引用类型对象时,有两部分,实际对象实例和变量名称代表的引用(内部为 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