有没有办法可以在不使用匿名函数的情况下将参数传递给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);
});
答案 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;代表案件?谁知道呢。
() =>
并不是为了能够阅读方法并了解您传递代理与价值而付出的代价。