gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:52:20 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这是因为当我们将变量写入引用类型对象时,有两部分,实际的对象实例,以及变量名所代表的引用(内部 32 位或 64 位内存地址指针,平台相关)。您可以使用 this sharplab.io snippet 清楚地看到这一点.

当我们调用一个方法时,这个指针被复制,但实例不是,所以:

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

关于C# 如果数组是按引用传递的,为什么参数数组必须用修饰符 ref 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59128635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com