调用者的"out"关键字的目的是什么(在C#中)?

Dim*_* C. 1 c# parameters ref out

当C#函数具有输出参数时,您可以按如下方式清除:

private void f(out OutputParameterClass outputParameter);
Run Code Online (Sandbox Code Playgroud)

这表明在调用函数时不必初始化参数.但是,在调用此函数时,您必须重复out关键字:

f(out outputParameter);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 27

这意味着你知道你在做什么 - 你承认它是一个out参数.你是否真的希望完全不同的行为无声地发生?ref顺便说一句,情况也是如此.

(你也可以根据by-value vs out/ref重载,但我不推荐它.)

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

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

  • 究竟.如果你的变量被被调用者无意识地改变,它会引起巨大的麻烦. (3认同)
  • @ Pierre-Alain:重载可能会让人感到困惑.通过参数如何传递这样一个相对微妙的事情进行重载几乎必然会引起混淆. (3认同)
  • 这儿这儿!PHP"按引用返回"(或通过引用传递参数,同样的事情)让您通过在分配返回值时排除&符号来忽略"按引用".谈论一个疯狂的疯狂的bug,找到你遗漏的所有东西都是一个&符号.在C#中要求"out"是避免此类错误的最佳方法. (2认同)