【问题标题】:How to provide default value for a parameter of delegate type in C#?如何在 C# 中为委托类型的参数提供默认值?
【发布时间】:2014-09-18 15:52:59
【问题描述】:

在 C# 中,我们可以提供参数的默认值,如下所示:

void Foo(int i =0) {}

但是,当方法签名是:

void FooWithDelegateParam(Func<string,string> predicate)
{}

我们如何传递默认参数:

void FooWithDelegateParam(Func<string,string> predicate = (string,string x)=> {return y;})
{}

但这不会编译。那么,这样做的正确语法是什么?

注意:我试图提供一种方法来通过委托指定 输入字符串到输出字符串映射器,如果没有提供,我只想返回输入字符串。因此,对于实现这一目标的任何替代方法的建议也受到高度赞赏。谢谢。

【问题讨论】:

    标签: c# syntax delegates optional-parameters


    【解决方案1】:

    你不能,基本上。参数的默认值必须是编译时常量。但是,如果您乐于使用 null 作为表示“使用默认值”的值,您可以:

    void FooWithDelegateParam(Func<string, string> predicate = null)
    {
        predicate = predicate ?? (x => x);
        // Code using predicate
    }
    

    当然,也可以按照 Alireza 的建议使用重载。

    每个选项都有不同的含义:

    • 重载解决方案适用于不支持可选参数的语言(例如 4.0 之前的 C#)
    • 重载解决方案区分null 和“默认值”。这本身就有利有弊:
      • 如果调用者永远不应该提供 null 值,则重载版本会发现它意外这样做的错误
      • 如果您不相信会有任何此类错误,可选参数版本允许在代码中表示“默认”的想法 - 您可以通过多个层传递“null 表示默认”值,只让最底层决定默认值的实际含义,这样做比必须显式调用不同的重载更简单
    • 可选参数版本更容易在接口中表达...
      • ... 缺点是仍需要在实现中表示默认值。 (这在重载解决方案中有些常见,请注意……在这两种情况下,实现接口的抽象类都可以使用模板方法模式进行默认设置。)

    【讨论】:

    • Jon 我很好奇每个人的优缺点。你的当然是一个多合一的方法,更容易维护,我的方法没有运行时重载。还有什么?
    • 是的,没错。我自己也发现了。
    • 也许是一个非英语为母语的人,问题出在我身上,但我不得不阅读列表两次以确保我准确理解哪篇文章是“专业人士”,哪篇文章是“骗子” .只是说-也许最好写一些像“Pro:内容... Con:内容”这样的东西,只是为了让我们其他人一目了然:-)
    • @ZoharPeled:我认为在所有不同的选项中都有足够的微妙之处,以至于它并没有真正区分为“利弊”。我将对其进行编辑,以消除认为它是一个简单的“利弊”列表的想法。
    【解决方案2】:

    你不能这样指定默认值。改为写一个重载:

    void FooWithDelegateParam()
    {
        FooWithDelegateParam(s => s);
    }
    
    void FooWithDelegateParam(Func<string,string> predicate)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 2012-09-27
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多