不使用匿名函数将参数传递给Action?

时间:2018-03-05 01:37:45

标签: c#

有没有办法可以在不使用匿名函数的情况下将参数传递给Action?

例如,以下代码可以正常工作:

while (l<h) {
    while (!isalnum(a[l]) && l<h) l++;
    while (!isalnum(a[h]) && l<h) h--;
    if (tolower(a[l++]) != tolower(a[h--])) {
        printf("%s is not a palindrome\n", a);
        return 1;
    }
}
printf("%s is a palindrome\n", a);
return 0;

但我想做的是:

private void doSomethingAndLogIt(string log, Action dosomething)
{
        Debug.WriteLine(log);
        dosomething();
}

private void multiplyIt()
{
        _result = "great";
}

...

doSomethingAndLogIt("Did something", multiplyIt);

我意识到我可以这样做:

private void doSomethingAndLogIt(string log, Action<int> dosomething)
{
        Debug.WriteLine(log);
        dosomething(???);
}

private void multiplyIt(int a)
{
        _result = "great";
}

doSomethingAndLogIt("Did something", multiplyIt(5));

但它很令人困惑。我也意识到我可以这样做:

private void doSomethingAndLogIt(string log, Action<int> dosomething, int inputValue)
{
        Debug.WriteLine(log);
        dosomething(inputValue);
}

private void multiplyIt(int a)
{
        _result = "great";
}

doSomethingAndLogIt("Did something", multiplyIt, 5);

但如果我能做到这一点会很棒:

doSomethingAndLogIt("Did something", () => {
    multiplyIt(5);
});

2 个答案:

答案 0 :(得分:1)

你不需要做任何特别的事情。以下代码:

doSomethingAndLogIt("Test", () => multiplyIt(5));

已经做了你想做的事。调用委托时,参数5也将被传入。为什么?因为被调用方将调用您的委托,您将使用参数multiply调用方法5

Here是一个快速测试。

答案 1 :(得分:0)

从当前版本的C#开始,这是不可能的,这就是为什么......

让我们举个例子(假句法)

public int MultiplyIt(int value)
{
    //Do something that has side-effects
}

public void SomeMethod(Action<int> someAction<int>)
{
    //Do something
    someAction();
}

现在让我们创建该方法的覆盖:

public void SomeMethod(int someValue)
{
    //Do something
}

现在你打电话给它:

SomeMethod(multiplyIt(5))

编译器调用了哪一个?

让我们说你不要超载它(或者由于某种原因,如果你这样做,编译器会发出错误,但它是合法的)。

这两个电话的区别是什么?

SomeMethod(multiplyIt(5));
SomeMethod(() => multiplyIt(5));

从技术上讲,第一个在将值传递给multiplyIt之前运行SomeMethod 。第二个multiplyIt可能永远不会被调用,或者它可能会改变某些东西然后调用它。这是一个重要的区别。如果你添加一些方法来调用它而没有() =>部分,开发人员无法在不阅读文档的情况下知道如何调用方法调用(和操作)。这是正常的方法调用吗? &#34;特别&#34;代表案件?谁知道呢。

() =>并不是为了能够阅读方法并了解您传递代理与价值而付出的代价。