我有一段这样的代码:

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可能会对委托执行某些操作

08-03 23:55