C#具有out
和ref
关键字。为什么需要这两个?免责声明:我对C#并不了解。
ref
和之间的区别out
?还是您在问,与按值参数(无修饰符)相比,按引用参数ref
/ 的用法是什么out
?或两者?
C#具有out
和ref
关键字。为什么需要这两个?免责声明:我对C#并不了解。
ref
和之间的区别out
?还是您在问,与按值参数(无修饰符)相比,按引用参数ref
/ 的用法是什么out
?或两者?
Answers:
在实现方面,它们本质上是相同的东西,但是out
传达的东西ref
不一样:您不在乎输入。 这对您和工具来说意味着某些事情。例如,您可以将未初始化的变量传递给out
参数,这不成问题,否则会出现问题,并且在函数中,您需要out
在返回值之前为该参数分配一个值,而无需执行任何操作都有ref
价值。
out
为其提供了一种方法,该方法可以更好地匹配您首先要如何处理变量。
out
参数,因为接收该函数的函数不会从中读取。
要理解这两个关键字,您需要了解通过引用传递值的含义。从本质上讲,这意味着,如果您修改在方法或函数中传递的参数变量,则在函数退出时该变量将保留其修改后的值。将参数声明为ref
或out
完成此操作,而普通参数变量将保留其原始值,即使您在函数中对其进行了修改。
ref
和之间的唯一区别out
是out
不需要在将变量传递给函数之前初始化变量,但是需要ref
;while out
确实需要您为函数中的变量分配某些内容,但ref
并非如此。
其核心都ref
和out
提供一个机制,一个变量的地址传递给方法,以便它可以被更新-分配给ref
或out
参数更新调用者的上下文变量。它们的不同之处在于保证:out
保证变量将被更新,ref
而不是被更新。
从通话的另一端也有类似的区别。out
我们方法的参数不能保证在到达时会包含任何有用的参数,并且必须在某个时刻将其设置为值,而ref
可以假定参数具有值,并且我们不需要对其进行任何特定的设置。
这种差异会对代码分析,生成和优化产生影响,尽管这些代码在大多数时候对我们而言并不十分明显,但可能会对程序的最终运行方式产生一些影响。代码生成器可以将变量的分配推迟到调用之前,优化器可能会决定根据合同等可以更有效地对某些操作进行重新排序,等等。
在用法方面:作为一般规则,我使用out
以下情况:当变量作为参数到达时以及ref
在执行变量时,我都不关心变量的内容。