可选输出参数

时间:2010-11-27 20:05:21

标签: c# c#-4.0

在C#4中,有一个提供可选输出参数的好方法吗?

5 个答案:

答案 0 :(得分:53)

不是真的,尽管你总是可以使用另一个不接受输出参数的方法重载该方法。

答案 1 :(得分:7)

使用OptionalAttribute修饰参数也不起作用。要扩展上一个示例,您将得到类似的内容:

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ }

请注意,上面将编译(可能不幸)。但是,尝试编译:

Func(out i);
除非明确提供带有单参数签名的重载,否则

将失败。

(理论上)使上述工作成为一个重大问题。当调用带有省略的可选参数的方法时,将创建包含所有参数值的堆栈帧,并使用指定的默认值填充缺失值。

但是,“out”参数是引用,而不是值。如果该参数是可选的并且未提供,那么它将引用哪个变量?编译器仍然需要强制要求在从方法正常返回之前填充“out”参数,因为编译器不知道调用者指定了哪个(如果有的话)可选参数。这意味着必须传递对虚拟变量某处的引用,因此该方法需要填充。管理这个虚拟变量空间会给编译器的编写者带来令人讨厌的麻烦。我并不是说要弄清楚这是如何工作的细节是不可能的,但是体系结构的影响非常大,以至于微软可以理解地传递了这个功能。

答案 2 :(得分:6)

没有

要使其“可选”,在您不需要在方法中指定值的意义上,您可以使用ref

答案 3 :(得分:2)

private object[] Func();

在返回对象数组中分配所需的可选输出,然后使用它们! 但如果你的意思是可选的输出,比如

private void Func(out int optional1, out string optional2)

然后你打电话给

Func(out i);
然后答案是你不能。 C#和.NET框架也有许多非常灵活的数据结构,如ListArray,您可以将它们用作输出参数或返回类型,因此无需实现有可选的输出参数。

答案 4 :(得分:1)

public class Dummy<T>
{
    public T Value;
}

然后使用functionDoSomething(out new Dummy<int>().Value,其中int可以是任何类型。