代码之家  ›  专栏  ›  技术社区  ›  cllpse

函数作为方法的参数

  •  2
  • cllpse  · 技术社区  · 14 年前

    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#中可能吗?


    更新

    用例:我在一堆数据库上迭代,记录特定的实体。而不是调用我的第二个函数( F() )内部 Log() 属于 Logger ,我想打电话给你 在教室外面。

    public void F(String databaseName)
    {
    }
    
    public class Logger
    {
        public void Log(Function f)
        {
            var databaseName = "";
    
            f(databaseName);
        }
    }
    
    4 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    当然-您只需要给方法一个适当的签名:

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

    请注意,必须在参数中指定特定的委托类型-不能将其声明为 Delegate

    EDIT:您的数据库示例与此完全相同—您希望传入一个字符串而不获取任何输出,这正是 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);
    
        2
  •  1
  •   desco    14 年前

    您可以传递委托:

            var f = (Action<string>)
                    (x =>
                         {
                             Console.WriteLine(x);
                         }
                    );
    
            var execute = (Action<Action<string>>)
                          (cmd =>
                               {
                                   cmd("Hello");
                               }
                          );
            execute(f);
    
        3
  •  1
  •   Arseny    14 年前

    根据您的更新部分: 你需要一个容器来保存你的功能

     IList<Action<string>> actionList = new List<Action<Sstring>>();
    

    在Log()函数中,可以将F()添加到容器中:

    actionList.Add(F);
    

    然后在外部某处调用函数:

     foreach (Action<string> func in actionList)
          {
               func("databasename");
          }
    
        4
  •  0
  •   Albin Sunnanbo    14 年前

    比如:

    var s = new Func<String, string>((string name) =>
    {
        return string.Format("Hello {0}!", name);
    });