我知道out
与ref
非常相似,只是它在进入函数时将传递的参数初始化为默认值。
我的问题是,在函数输入时重置变量会对什么情况有用?
如果有人可以向我展示out
比ref
更有用的示例,那就太棒了。
答案 0 :(得分:7)
ref
和out
之间的主要区别是意图。使用ref
时,预计传入的值将由函数使用。并且该功能可能会也可能不会设置它。如果需要,您甚至可以const ref
,这意味着传入的变量不会被复制,但也无法更改。
const out
没有任何意义,因为out
的意图是变量将在函数中设置。使用out
本质上是一种向函数添加另一个返回值的方法。 ref
可以用于此目的,但使用ref
并不会向来电者表明传入的值不会被使用,甚至不会被使用变量将被分配给,而out
表示该值将不,并且变量将分配给。
out
将变量设置为默认值的原因是为了避免错误。如果函数的目的是使用out
参数作为另一个返回值,那么您通常不希望该函数受传入的值的影响。通过设置out
参数为默认值,它保证该变量始终与该函数的值相同,无论传入的是什么,因此可以避免因函数意外依赖该值而导致的错误。
现在,不要求在函数中分配out
参数,但是它确实与调用者通信了它的意图,并且它 无论如何都要为其分配默认值,因此从调用者的角度来看,始终为out
参数赋值(即使它是默认值)。因此,如果有意义,该函数可以不设置out
参数(例如,如果默认值是"返回"在某些情况下)。
答案 1 :(得分:4)
out
与ref
类似,但它与调用者通信,您仅打算为函数内的变量赋值。这只是按惯例,但是编译器通过在函数入口处将变量初始化为init
值来强制执行它,因此除非您打算将变量标记为out
,否则没有任何意义分配给它。
编译器不强制执行您必须在函数期间对out参数进行赋值,例如,以下内容完全合法:
void test(out int n)
{
//Do nothing
}
void main()
{
int x;
test(x);
}
如果你有C背景,这或多或少像普通的C模式,其中一个函数获取一个指向变量的指针,以便在函数内初始化它。
答案 2 :(得分:2)
好“out”表示你必须在函数退出之前分配变量。用“ref”,不一定。如果我的记忆没有欺骗我,我认为就是这样。另一方面,参考C ++中的引用,您可以选择修改该值,也可以保留原样。
所以,如果你把某种对象传递给一个尚未初始化的函数,你可以用“out”传递它并让函数接受“out”并在函数中你可以创建那个宾语。但是,如果函数接受“ref”并传递未初始化的对象,我认为编译器会给你一个错误。
Charles Petzold的.Net Zero书(可免费下载)详细解释了所有这些美味佳肴。我建议你看看。