D""""""存储类有用吗?

时间:2014-07-09 16:18:43

标签: d

我知道outref非常相似,只是它在进入函数时将传递的参数初始化为默认值。

我的问题是,在函数输入时重置变量会对什么情况有用?

如果有人可以向我展示outref更有用的示例,那就太棒了。

3 个答案:

答案 0 :(得分:7)

refout之间的主要区别是意图。使用ref时,预计传入的值将由函数使用。并且该功能可能会也可能不会设置它。如果需要,您甚至可以const ref,这意味着传入的变量不会被复制,但也无法更改。

另一方面,

const out没有任何意义,因为out的意图是变量将在函数中设置。使用out本质上是一种向函数添加另一个返回值的方法。 ref 可以用于此目的,但使用ref并不会向来电者表明传入的值不会被使用,甚至不会被使用变量将被分配给,而out表示该值将,并且变量分配给。

out将变量设置为默认值的原因是为了避免错误。如果函数的目的是使用out参数作为另一个返回值,那么您通常不希望该函数受传入的值的影响。通过设置out参数为默认值,它保证该变量始终与该函数的值相同,无论传入的是什么,因此可以避免因函数意外依赖该值而导致的错误。

现在,不要求在函数中分配out参数,但是它确实与调用者通信了它的意图,并且它 无论如何都要为其分配默认值,因此从调用者的角度来看,始终为out参数赋值(即使它是默认值)。因此,如果有意义,该函数可以不设置out参数(例如,如果默认值是"返回"在某些情况下)。

答案 1 :(得分:4)

outref类似,但它与调用者通信,您打算为函数内的变量赋值。这只是按惯例,但是编译器通过在函数入口处将变量初始化为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书(可免费下载)详细解释了所有这些美味佳肴。我建议你看看。