c# - 如何在 C# 中为委托(delegate)类型的参数提供默认值?

标签 c# syntax delegates optional-parameters

在 C# 中,我们可以这样提供参数的默认值:

void Foo(int i =0) {}

但是,当方法签名是:

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

我们如何传递默认参数:

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

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

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

最佳答案

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

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

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

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

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

关于c# - 如何在 C# 中为委托(delegate)类型的参数提供默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24978661/

相关文章:

c - (void)strcpy(somevariable1, somevariable2) 正确吗?

syntax - 理论之间的观点都包括现代货币理论中的共同理论

sql - GROUP BY 语法导致 "missing expression"错误

ios - 以编程方式触发摇动事件iOS

c# - 滥用闭包?违反各种原则?或者好吗?

c# - 带有参数的 VSTemplate TargetFolderName

c# - 如何以编程方式添加 DataTrigger

c# - 启用基本和 Windows 身份验证

c++ - SpinBoxDelegate 显示为 DoubleSpinBoxDelegate

android - 将值返回到不同的 Activity