我有一段这样的代码:
GoAsync(() => GetPackagesExecute(serviceType));
如何理解此代码?没有名称方法的花括号是什么意思?
最佳答案
很难准确地告诉您这些方法的作用,因为它们不是“标准”方法。
例如,GoAsync
可以具有各种签名:
void GoAsync(Action action);
void GoAsync(Func<FooType> func);
甚至更复杂,例如:
void GoAsync(Expression<Action> action);
void GoAsync(Expression<Func<FooType>> func);
假设
GoAsync
的签名如下:void GoAsync(Action action);
现在,
GoAsync
接受一个委托(作为对函数的引用)作为参数。该函数不能有任何参数,也不能返回任何值(如果我们选择了第二个签名void GoAsync(Func<FooType> func);
,则该函数将返回一个FooType
对象)。 GoAsync
然后可以执行该函数引用并对其执行一些操作。请注意,GoAsync
甚至无法执行该委托。() => GetPackagesExecute(serviceType)
这样会创建一个不带任何参数的匿名函数,其主体为
GetPackagesExecute(serviceType)
,因此在其主体中,它仅使用参数GetPackagesExecute
(可能是局部变量或字段/属性)。在函数式语言中,这称为currying(创建一个调用另一个函数的函数,所调用的函数比创建的函数具有更多的参数)。在这种情况下,匿名函数具有0个参数,
serviceType
具有一个参数。从技术上讲,此匿名函数可以返回
GetPackagesExecute
的返回值,因此它等效于两者:void AnonymousMethod()
{
GetPackagesExecute(serviceType);
}
并
FooType AnonymousMethod()
{
return GetPackagesExecute(serviceType);
}
C#编译器根据
GetPackagesExecute()
的签名选择匿名函数的确切“类型”。这称为type inference in lambdas。现在
GoAsync(() => GetPackagesExecute(serviceType));
在一起将:
创建一个匿名函数(比这复杂一点……这里有一些C#编译器魔术,但是您可以忽略它)
创建该匿名函数的委托(此委托是隐式的,由C#编译器完成)
呼叫
GoAsync()
将此委托传递给它GoAsync
可能会对委托执行某些操作