首页 > 解决方案 > C# 如果数组通过引用传递,为什么必须使用修饰符 ref 传递参数数组?

问题描述

我不明白为什么这个函数是这样写的:

System.Array.Resize<int>(ref int[], int)

如果数组默认通过引用传递,为什么不这样写:

System.Array.Resize<int>(int[], int)

标签: c#arraysfunctionrefmodifier

解决方案


这是因为当我们将变量写入引用类型对象时,有 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


推荐阅读