在C#4中,有一个提供可选输出参数的好方法吗?
答案 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框架也有许多非常灵活的数据结构,如List
和Array
,您可以将它们用作输出参数或返回类型,因此无需实现有可选的输出参数。
答案 4 :(得分:1)
public class Dummy<T>
{
public T Value;
}
然后使用functionDoSomething(out new Dummy<int>().Value
,其中int
可以是任何类型。