【问题标题】:Optional Output Parameters [duplicate]可选输出参数 [重复]
【发布时间】:2011-05-16 16:05:06
【问题描述】:

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

【问题讨论】:

  • 看不到此类功能的任何价值。如果您曾经听过 C# 编译器人员在 PDC 上的会议,您会发现每一次更改都有其意义。
  • 我不同意这个功能没有任何价值。如果一个方法除了通过输出参数返回数据之外还有一些逻辑 - 我希望能够调用这个逻辑,只是不需要输出......
  • 我使用 Int32.TryParse() 来查看给定的字符串是否可以解析为数字,如果可以,有时这就是我所关心的。所以 Jitbit 是对的。
  • 有选择地从函数中捕获侧链信息会很方便。另外,如果 VB 有它,为什么 C# 没有呢?它应该会自动过载。

标签: c# c#-4.0


【解决方案1】:
public class Dummy<T>
{
    public T Value;
}

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

【讨论】:

    【解决方案2】:

    使用 OptionalAttribute 修饰参数也不起作用。要扩展前面的示例,您会得到如下内容:

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

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

    Func(out i);
    

    除非明确提供具有单参数签名的重载,否则将失败。

    要(理论上)进行上述工作是一个重大问题。当调用带有省略的可选参数的方法时,会创建一个包含所有参数值的堆栈框架,并且只需用指定的默认值填充缺失的值。

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

    【讨论】:

      【解决方案3】:
      private object[] Func();
      

      在返回对象数组中分配尽可能多的可选输出,然后使用它们! 但如果你的意思是可选输出类似

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

      然后你调用类似的东西

      Func(out i);
      

      那么答案是否定的,你不能。 C# 和 .NET 框架也有许多非常灵活的数据结构,例如 ListArray,您可以将它们用作输出参数或返回类型,因此无需实现具有可选输出参数的方法.

      【讨论】:

        【解决方案4】:

        并非如此,尽管您总是可以用另一个不带输出参数的方法重载该方法。

        【讨论】:

        • 知道如何在不采用输出参数的重载中比{ string dummy; return Foo(out dummy); } 更优雅地处理可选参数吗?
        • @Louis:不,我可能会这样做!
        • 那是很多额外的样板代码。
        • 在 C# 7.0 中,您可以使用 Foo(out string dummy); 甚至更好的 Foo(out _);(下划线)
        • 这是可能的事实表明它在语言设计中应该是可选的。这似乎是一个不错的解决方案。虽然,它不允许我将输出参数放在其他可选参数之后,如果我希望重载具有相同的参数顺序,这可能会导致拼写错误
        【解决方案5】:

        没有。

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

        【讨论】:

        • ref 参数是一个非常不同的用例。如果调用者没有指定一个可选参数,则传入一个特定的值——使用 ref 参数,调用者总是指定一个值,无论他们是否觉得他们已经指定了它。 ref 始终指向有效的内存位置,并且有效的内存位置始终包含 something。充其量,这只是一个神奇的值,没有默认规范说“默认值为 X”。
        • 是的,这个答案不是设计判断,这就是为什么我添加了“在某种意义上”限定词。
        猜你喜欢
        • 2014-07-10
        • 2010-12-16
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2015-08-06
        • 2016-05-30
        相关资源
        最近更新 更多