什么';sd';s";“出去”;存储类对您有用吗?

什么';sd';s";“出去”;存储类对您有用吗?,d,D,我知道,out的工作原理与ref非常相似,只是它在进入函数时将传递的参数初始化为其默认值 我的问题是,在什么情况下,“在函数输入时重置变量”会有用 如果有人能给我举个例子,out比ref更有用,那就太好了。嗯,“out”表示在函数退出之前必须为变量赋值。带“ref”,不一定。我想是这样的,如果我的记忆没有欺骗我的话。另一方面,Ref,像C++中的引用一样,可以选择修改值,也可以保留它。 因此,假设您正在将某种类型的对象传递给一个尚未初始化的函数,您可以使用“out”传递它,让函数接受“out”,

我知道,
out
的工作原理与
ref
非常相似,只是它在进入函数时将传递的参数初始化为其默认值

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

如果有人能给我举个例子,
out
ref
更有用,那就太好了。嗯,“out”表示在函数退出之前必须为变量赋值。带“ref”,不一定。我想是这样的,如果我的记忆没有欺骗我的话。另一方面,Ref,像C++中的引用一样,可以选择修改值,也可以保留它。

因此,假设您正在将某种类型的对象传递给一个尚未初始化的函数,您可以使用“out”传递它,让函数接受“out”,并在函数中创建该对象。但是,如果函数接受“ref”,并且您传递了一个未初始化的对象,我认为编译器会给您一个错误


Charles Petzold的.Net Zero书(可免费下载)详细解释了所有这些美食。我建议您阅读。

out
类似于
ref
,但它向调用者传达的信息是,您只想为函数内部的变量赋值。这只是按照惯例,但编译器通过在函数项上将变量初始化为其
init
值来强制执行它,因此除非您打算分配给它,否则将变量标记为
out

编译器不强制要求您在函数执行期间必须对out参数赋值,例如,以下是完全合法的:

void test(out int n)
{
    //Do nothing
}

void main()
{
    int x;
    test(x);
}

如果您有C背景,这或多或少类似于常见的C模式,其中函数获取指向变量的指针,以便在函数内部对其进行初始化。

ref和
out
之间的主要区别在于意图。使用
ref
时,预期传递的值将由函数使用。函数可以设置它,也可以不设置它。如果需要,您甚至可以使用
const ref
,这意味着传入的变量不会被复制,但也无法更改

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

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


现在,不需要在函数中为
out
参数赋值,但它确实向调用方传达了这一意图,并且不管它是什么,它都会为它赋值默认值,因此从调用方的角度来看,
out
参数总是被赋值(即使它是默认值)。因此,如果有意义的话,函数可以自由地不设置
out
参数(例如,如果默认值是在某些情况下应该“返回”的值)。

但是D总是用默认值初始化数据类型,没有像C&C++中那样的
未初始化对象
是的,你是对的。我最近一直在编码太多C++:这里总是有点强。未初始化的对象可以在D中使用(不在@safe D中),并带有void声明。int i=无效;基本上用C语言声明一个变量。