非常感谢帮助
正确和谨慎地使用语言会提高你的理解力。
按值传递意味着传递参数的副本。
是的,这完全准确。
对该副本的更改不会更改原件。
不完全是。首先要仔细区分值和变量。考虑:
class Foo { public int x; }
...
void N()
{
Foo blah = new Foo();
blah.x = 0;
M(blah);
}
...
void M(Foo foo)
{
foo.x = 123; // changes blah.x
foo = null; // does not change blah
}
这里的变量是 x、blah 和 foo。x 是一个字段,blah 是一个本地,foo 是一个形式参数。
这里的值是 null、0、123,以及对 Foo 实例的引用。 该参考是一个价值。了解这一事实至关重要。
通过将变量 blah 的值复制到变量 foo 中来传递 blah 值的副本。blah 的值是对 Foo 实例的引用。
M 可以更改变量 x 的值,因为 M 具有 blah 值的副本,它是对 Foo 的引用。当 M 将 foo 的内容更改为 null 时,不会改变 blah;foo 包含 blah 值的副本。
通过引用传递意味着对原始的引用被传递。
仔细选择你的措辞。什么是“原作”?
最好将其表述为“通过引用传递意味着传递了对必须是变量的参数的引用”。一种更简单的思考方式是“通过引用传递使参数成为作为参数传递的变量的别名”。
对参考的更改会影响原件。
由于形参和实参互为别名,因此对引用的更改不会影响原始值;参考是原件。它们都是同一个变量。
REF 告诉编译器对象在进入函数之前已经初始化。
“对象”毫无意义。你的意思是“变量”。
“ref”不会“告诉编译器变量已初始化”。相反,“ref”告诉编译器“您,编译器,必须验证变量是否已初始化”。那是相当不同的!
REF 表示该值已设置,
不, ref 要求变量已经设置。没有“设定价值”之类的东西。
因此,该方法可以读取并修改它。
“它”的意思是“变量”。
REF 有两种方式,既进又出。
正确的。
OUT 告诉编译器对象将在函数内部初始化。
停止使用“对象”来表示“变量”。如果你停止混淆完全不同的事物,你会更清楚地理解事物。变量不是对象。变量是存储位置,其中一些可能包含值,而其中一些值可能是对对象的引用。
所以,out 告诉编译器变量将在方法内部初始化,是的,但这并不完全正确。您忘记了该方法将引发异常或该方法将进入无限循环的情况——这些也是合法的情况。
OUT 表示该值尚未设置,
同样,“值”是指“变量”。但这并不准确。将初始化变量作为“out”参数传递是完全合法的。无意义,但合法。
因此必须在调用 return 之前设置。
不调用“return”;方法被调用。但是是的,该方法必须在正常返回之前为变量赋值。
OUT只是一种方式,就是out。
对。
那么在什么场景下你会结合使用 ref 和 out 关键字
没有这样的场景。