Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可选输出参数_C#_C# 4.0 - Fatal编程技术网

C# 可选输出参数

C# 可选输出参数,c#,c#-4.0,C#,C# 4.0,在C#4中,有没有一种好的方法来设置可选的输出参数 要使其成为“可选”,即不需要在方法中指定值,您可以使用ref而不是真的,尽管您可以始终使用另一个不带输出参数的方法来重载该方法 private object[] Func(); 在返回对象数组中指定尽可能多的可选输出,然后使用它们! 但是如果你指的是可选输出,比如 private void Func(out int optional1, out string optional2) Func(out i); 然后你打电话给 private

在C#4中,有没有一种好的方法来设置可选的输出参数


要使其成为“可选”,即不需要在方法中指定值,您可以使用
ref

而不是真的,尽管您可以始终使用另一个不带输出参数的方法来重载该方法

private object[] Func();
在返回对象数组中指定尽可能多的可选输出,然后使用它们! 但是如果你指的是可选输出,比如

private void Func(out int optional1, out string optional2)
Func(out i);
然后你打电话给

private void Func(out int optional1, out string optional2)
Func(out i);
那么答案是不行。
此外,C#和.NET framework有许多非常灵活的数据结构,如
列表
数组
,您可以将它们用作输出参数或返回类型,因此无需实现具有可选输出参数的方法。

用OptionalAttribute装饰参数也不起作用。要扩展上一个示例,您将得到如下结果:

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ }
请注意,上面的代码将被编译(可能很不幸)。但是,尝试编译:

Func(out i);
将失败,除非显式提供带有单参数签名的重载

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

但是,“out”参数是一个引用,而不是一个值。如果该参数是可选的且未提供,它将引用什么变量?编译器仍然需要强制要求在方法的任何正常返回之前填充“out”参数,因为编译器事先不知道调用方指定了哪些(如果有的话)可选参数。这意味着必须传递对某个地方的伪变量的引用,以便该方法有东西要填充。管理这个虚拟变量空间会给编译器的编写者带来令人头痛的问题。我并不是说不可能计算出如何工作的细节,但是架构的影响已经足够大了,微软可以理解地将这一特性传递给了微软。

public-class-Dummy
public class Dummy<T>
{
    public T Value;
}
{ 公共价值观; }

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

看不到此类功能的任何值。如果你曾经在PDC上听过C#compiler家伙的会话,你会发现每一个更改都有其意义。我不同意这个特性没有任何价值。如果一个方法除了通过out参数返回数据之外还有一些逻辑——我希望能够调用这个逻辑,只是不需要输出……我使用Int32.TryParse()来查看给定字符串是否可以解析为数字,如果可以,有时我只关心这些。所以Jitbit是正确的。它可以方便地从函数中选择性地捕获侧链信息。另外,如果VB有,为什么C#没有呢?它应该会自动重载。你知道如何比重载中不接受输出参数的
{string dummy;return Foo(out dummy);}
更优雅地处理可选参数吗?@Louis:不,我可能会这么做!这是大量额外的锅炉板代码。在C#7.0中,您可以执行
Foo(out-string-dummy)或更好的
Foo(out)(下划线)这是可能的,这表明它在语言设计中应该是可选的。这似乎是个不错的解决方案。尽管如此,它不允许我将输出参数放在其他可选参数之后,如果我期望重载具有相同的参数order,这可能会导致输入错误。a
ref
参数是一个非常不同的用例。如果调用者没有指定一个值,则可选参数会传入一个特定的值——使用ref参数,调用者总是指定一个值,不管他们感觉是否指定了该值。
ref
总是指向有效的内存位置,并且有效的内存位置总是包含一些内容。充其量,这只是一个神奇的值,没有默认规范的好处,默认规范说“默认值是X”。是的,这个答案不是设计判断,这就是为什么我添加了“在这个意义上”限定符。