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

What is the purpose of the “out” keyword at the caller (in C#)?

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

1
private void f(out OutputParameterClass outputParameter);

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

1
f(out outputParameter);

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


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

(您也可以根据值vs out/ref进行重载,但我不推荐这样做。)

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

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


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


对于可读性,了解方法可以/将对变量做什么。

从msdn获得更多信息:http://msdn.microsoft.com/en-us/vcsharp/aa336814.aspx

The caller of a method which takes an
out parameter is not required to
assign to the variable passed as the
out parameter prior to the call;
however, the callee is required to
assign to the out parameter before
returning.


虽然我不知道这种决定的起源,但我知道它有超载的目的。

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

1
private void f(out OutputParameterClass outputParameter);

1
private void f(OutputParameterClass outputParameter);

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


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

很明显,没有这个编译器就可以做得很好。但是,添加了out关键字后,您的意图就变得清晰了,代码也变得清晰易读。


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


我得到的最佳答案是普林特发表的评论:

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


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