“的目的是什么?”;“出去”;调用方的关键字(用C#)表示)?

“的目的是什么?”;“出去”;调用方的关键字(用C#)表示)?,c#,parameters,ref,out,C#,Parameters,Ref,Out,当C#函数有一个输出参数时,您可以按如下方式说明: private void f(out OutputParameterClass outputParameter); 这表示调用函数时不必初始化参数。但是,调用此函数时,必须重复out关键字: 我想知道这有什么好处。为什么需要重复部分功能规范?有人知道吗 为了清晰起见,您可能必须使用out。如果你不看方法签名就不知道。为了清晰起见,你可能必须使用out。如果你不看方法签名就不知道的话。这是一个设计特性。很明显,这是没有必要的,但它有助于可读性

当C#函数有一个输出参数时,您可以按如下方式说明:

private void f(out OutputParameterClass outputParameter);
这表示调用函数时不必初始化参数。但是,调用此函数时,必须重复out关键字:


我想知道这有什么好处。为什么需要重复部分功能规范?有人知道吗

为了清晰起见,您可能必须使用
out
。如果你不看方法签名就不知道。

为了清晰起见,你可能必须使用
out
。如果你不看方法签名就不知道的话。

这是一个设计特性。很明显,这是没有必要的,但它有助于可读性

这是一个设计特点。很明显,这是没有必要的,但它有助于可读性

这意味着你知道自己在做什么——你承认这是一个
out
参数。你真的希望完全不同的行为静静地发生吗?顺便说一下,
ref
也是如此

(您也可以基于by value vs out/ref重载,但我不建议这样做。)

基本上,如果您有一个(未捕获的)局部变量,并将其用作非out/ref参数,那么您知道该变量的值在方法中不会更改。(如果它是一个引用类型变量,那么它所引用的对象中的数据可能会被更改,但这是非常不同的。)


<>这避免了C++中你在不知不觉中通过引用传递某些东西的情况,但是假设值没有改变…

这意味着你知道你在做什么-你承认这是一个<代码> Out/<代码>参数。你真的希望完全不同的行为静静地发生吗?顺便说一下,
ref
也是如此

(您也可以基于by value vs out/ref重载,但我不建议这样做。)

基本上,如果您有一个(未捕获的)局部变量,并将其用作非out/ref参数,那么您知道该变量的值在方法中不会更改。(如果它是一个引用类型变量,那么它所引用的对象中的数据可能会被更改,但这是非常不同的。)


这避免了C++中你在不知不觉中通过引用传递某些东西的情况,但是假设值没有改变…

我唯一能看到的原因是确保函数的用户知道这个参数的值可以被函数修改。我认为这是一件好事。

我能看到的唯一原因是确保函数的用户知道该函数可以修改此参数的值。我认为这是一件好事。

虽然我不知道这种决定的由来,但我知道它有超载的目的

在同一类中创建这两个函数是完全合法的:

private void f(out OutputParameterClass outputParameter);


调用这种重载时指定
out
关键字是有意义的。

虽然我不知道这种决定的来源,但我知道它有重载的目的

在同一类中创建这两个函数是完全合法的:

private void f(out OutputParameterClass outputParameter);


调用这种重载时指定
out
关键字是有意义的。

我认为这是一个一致性和清晰性的问题


很明显,编译器可以在没有。然而,添加out关键字后,您的意图变得清晰,代码也变得越来越清晰。

我认为这是一个一致性和清晰性的问题


很明显,编译器可以在没有。但是,添加out关键字后,您的意图变得清晰,代码变得更清晰易读。

为了可读性,您需要知道该方法可以/将对您的变量做什么

已从MSDN获得更多信息:

采用 不需要使用out参数 分配给作为 调用前输出参数; 但是,被调用方必须 在指定之前,先指定out参数 返回


为了可读性,请了解该方法可以/将对变量做什么

已从MSDN获得更多信息:

采用 不需要使用out参数 分配给作为 调用前输出参数; 但是,被调用方必须 在指定之前,先指定out参数 返回


我得到的最佳答案是作为评论发布的:


重复out/ref最重要的原因是,如果调用的函数使用不同的签名进行重构,则会出现编译错误。最值得注意的是,如果一个参数从non-out变为out,您将立即知道。

我得到的最佳答案是作为注释发布的:


重复out/ref最重要的原因是,如果调用的函数使用不同的签名进行重构,则会出现编译错误。最值得注意的是,如果参数从非输出变为输出,您将立即知道。

准确无误。如果被调用方无意识地更改了变量,则可能会引起巨大的麻烦。这里!PHP“通过引用返回”(或通过引用传递参数,同样的事情)允许您忽略“通过引用”,方法是在指定返回值时排除符号和。谈论一个疯狂疯狂的虫子,当你只剩下一个符号的时候。在C#中要求“退出”是避免此类错误的最明智的方法。@Dimitri:不,它们不是。引用是按值传递的。这是一个巨大的差异。请阅读Dimitri C:引用Jon的话:“对象根本不被传递。引用是通过值传递的。”@Pierre Alain:重载可能会让人很困惑。通过诸如参数如何传递这样一个相对微妙的事情进行重载几乎必然会引起混乱。如果您的变量是uncon,则可能会引起巨大的麻烦
private void f(OutputParameterClass outputParameter);