我有一段这样的代码:
GoAsync(() => GetPackagesExecute(serviceType));
如何理解这段代码?,没有名称方法的大括号是什么意思?
答案 0 :(得分:3)
很难准确地告诉你这些方法的作用,因为它们不是标准的"方法......
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
执行serviceType
(可能是局部变量或字段/属性)。
在函数式语言中,这称为currying(创建一个调用另一个函数的函数,被调用的函数比创建的函数有更多的参数)。在这种情况下,匿名函数有0个参数,GetPackagesExecute
有一个参数。
从技术上讲,这个匿名函数可以返回GetPackagesExecute()
的返回值,因此它等同于:
void AnonymousMethod()
{
GetPackagesExecute(serviceType);
}
和
FooType AnonymousMethod()
{
return GetPackagesExecute(serviceType);
}
确切的&#34;类型&#34; C#编译器根据GoAsync()
的签名选择匿名函数。这称为type inference in lambdas。
现在,
GoAsync(() => GetPackagesExecute(serviceType));
将一起:
GoAsync
将此代表传递给它GoAsync
可能会对委托答案 1 :(得分:0)
这是一种叫做lambda表达式的东西。这是一个相当高级的主题,但它是一个非常核心的功能。很难解释这一切所以我找到了这个链接供你查看。
https://msdn.microsoft.com/en-us/library/bb397687.aspx
它会解释一切,但是根据你的经验水平它可能没有任何意义,它应该给你一个跳跃块继续前进并进行调查。