c# - 作为方法参数的函数

标签 c# functional-programming

您可以像在 JavaScript 中一样在 C# 中执行匿名函数:

JavaScript:

var s = (function ()
{
    return "Hello World!";
}());

C#:

var s = new Func<String>(() =>
{
    return "Hello World!";
})();

... 在 JavaScript 中,您可以传递要由其他函数执行的函数。最重要的是;您可以将参数传递给执行的函数:

var f = function (message) // function to be executed
{
    alert(message);
};

function execute(f) // function executing another function
{
    f("Hello World!"); // executing f; passing parameter ("message")
}

上面的例子在 C# 中可行吗?


更新

用例:我正在遍历一堆数据库,记录特定实体。我不想调用 LoggerLog() 中的第二个函数 (F()),而是调用 F( ) 课外。

... 类似以下内容:

public void F(String databaseName)
{
}

public class Logger
{
    public void Log(Function f)
    {
        var databaseName = "";

        f(databaseName);
    }
}

最佳答案

当然 - 您只需要为该方法提供适当的签名:

public void Execute(Action<string> action)
{
    action("Hello world");
}
...
Execute(x => Console.WriteLine(x));

请注意,您必须在参数中指定特定的委托(delegate)类型 - 您不能只将其声明为 Delegate例如。

编辑:您的数据库示例与此完全相同 - 您想要传入一个字符串而不获取任何输出,这正是 Action<string> 的内容做。除非您尝试调用现有方法(代码中的 F()),否则您甚至不需要 lambda 表达式 - 您可以改用方法组转换:

public void F(String databaseName)
{
}

public class Logger
{
    public void Log(Action<string> f)
    {
        var databaseName = "";

        f(databaseName);
    }
}

// Call it like this:
Logger logger = new Logger(...);
logger.Log(F);

关于c# - 作为方法参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546109/

相关文章:

c# - 从自定义属性访问父类

c# - 远程处理错误 : Requested Service Not Found

C# 向 COM 公开 - 接口(interface)继承

algorithm - F# 算法中的意外 NullReferenceException

haskell - 我如何在 Haskell 中显示派生树?

c# - WebAPI2 Json.Net 必需属性未正确添加 ModelState 错误

c# - 未创建 Nlog 日志文件

list - 指定位置可以采用的元素的情况下,生成所有可能列表的列表的函数

javascript - 函数式响应式(Reactive)编程 (FRP) 可以用 monad 表达吗?

javascript - 使用 RxJS 进行响应式编程 - 这个滚动功能可以简化吗?