可选的输出参数
在C#4中,是否有一个好的方法来有一个可选的输出参数?
不是真的,虽然你总是可以重载方法与另一个不采取输出参数。
使用OptionalAttribute装饰参数也不起作用。 为了扩展以前的样本,你会得到像这样的东西:
private void Func( [Optional] out int optional1, [Optional] out string optional2) { /* ... */ }
请注意,以上将编译(也许不幸)。 但是,试图编译:
Func(out i);
将会失败,除非明确提供了带有单参数签名的重载。
(理论上)使上述工作成为一个重大问题。 当一个带有省略的可选参数的方法被调用时,一个包含所有参数值的堆栈框架被创build,并且缺less的值被简单地用指定的缺省值填充。
但是,“out”参数是一个参考,而不是一个值。 如果该参数是可选的并且没有提供,它会引用哪个variables? 编译器仍然需要强制执行这样的要求,即在任何正常的方法返回之前填充“out”参数,因为编译器事先并不知道调用者指定了哪个(如果有的话)可选参数。 这意味着对某个地方的虚拟variables的引用将被传递,所以该方法有一些东西需要填充。 pipe理这个虚拟variables空间会给编译器的编写者造成一个讨厌的头痛。 我并不是说要搞清楚这个方法的细节是不可能的,但是微软可以理解的是,这个架构的意义已经足够了。
没有。
为了使其成为“可选”,从您不需要在方法中指定值的意义上说,您可以使用ref
。
private object[] Func();
在返回对象数组中指定任意数量的输出,然后使用它们! 但如果你的意思是可选的输出类似
private void Func(out int optional1, out string optional2)
然后你打电话像
Func(out i);
那么答案是不可以的。 另外C#和.NET框架还有许多像List
和Array
这样非常灵活的数据结构,您可以将它们用作输出参数或返回types,因此不需要实现具有可选输出参数的方法。
public class Dummy<T> { public T Value; }
然后使用functionDoSomething(out new Dummy<int>().Value
,其中int
可以是任何types。