当 C# 函数具有输出参数时,您可以如下说明:
private void f(out OutputParameterClass outputParameter);
这表明在调用函数时不必初始化参数。但是,调用此函数时,您必须重复 out 关键字:
f(out outputParameter);
我想知道这有什么好处。为什么需要重复部分功能规范?有人知道吗?
当 C# 函数具有输出参数时,您可以如下说明:
private void f(out OutputParameterClass outputParameter);
这表明在调用函数时不必初始化参数。但是,调用此函数时,您必须重复 out 关键字:
f(out outputParameter);
我想知道这有什么好处。为什么需要重复部分功能规范?有人知道吗?
这意味着你知道你在做什么——你承认它是一个out
参数。您真的希望完全不同的行为无声地发生吗?顺便说一句,对于 也是如此ref
。
(您也可以基于按值与输出/引用重载,但我不建议这样做。)
基本上,如果您有一个(未捕获的)局部变量并将其用作非 out/ref 参数,则您知道该变量的值不会在方法内更改。(如果它是一个引用类型变量,那么它所引用的对象中的数据可能会改变,但这是非常不同的。)
这避免了你在 C++ 中遇到的那种情况,你在不知不觉中通过引用传递了一些东西,但假设值没有改变......
这是一个设计特点。很明显,这不是必需的,但它有助于提高可读性。
虽然我不知道这种决定的起源,但我知道它有超载的目的。
在同一个类中创建这两个函数是完全合法的:
private void f(out OutputParameterClass outputParameter);
和
private void f(OutputParameterClass outputParameter);
在调用此类重载时指定out
关键字是有意义的。
为了可读性,了解该方法可以/将对您的变量做什么。
从 MSDN 获得了更多信息:http: //msdn.microsoft.com/en-us/vcsharp/aa336814.aspx
带有 out 参数的方法的调用者不需要在调用之前分配作为 out 参数传递的变量;但是,被调用者需要在返回之前分配给 out 参数。
我能看到的唯一原因是确保函数的用户知道这个参数的值可以被函数修改。我认为这是一件好事。
我认为这是一个一致性和清晰性的问题。
显然,没有编译器也可以做得很好。但是,添加 out 关键字后,您的意图变得清晰,代码变得更加清晰易读。
我得到的最佳答案是plinth发表的评论:
重复 out/ref 的最重要原因是,如果你调用的函数被重构为不同的签名,你会得到一个编译错误。最值得注意的是,如果一个参数从非输出变为输出,您马上就会知道。
为了清楚起见,您可能必须使用out
。如果您不查看方法签名就不会知道。