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

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

private void f(out OutputParameterClass outputParameter); 

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

 f(out outputParameter); 

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

这意味着你知道你正在做什么 – 你承认它是一个out参数。 你真的想要完全不同的行为吗? 顺便说一句, ref也是如此。

(你也可以根据by-value vs 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关键字后,您的意图就会明确,代码会更清晰,更清晰。

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

重复输出/ ref的最重要原因是,如果您调用的函数被重构为不同的签名,则会出现编译错误。 最值得注意的是,如果参数从非out到out,你马上就会知道。

为了清晰起见,您可能需要使用。 如果你不知道没有看方法签名。