这意味着什么GoAsync(()=>;GetPackagesExecute(serviceType));在C#中
本文关键字:serviceType GetPackagesExecute 什么 意味着 GoAsync gt | 更新日期: 2023-09-27 17:59:12
我有一段这样的代码:
GoAsync(() => GetPackagesExecute(serviceType));
如何理解此代码?,什么是没有name方法的大括号?
很难准确地告诉您这些方法的作用,因为它们不是"标准"方法。。。
例如,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)
,因此在其主体中,它只是使用参数serviceType
(可能是局部变量或字段/属性)执行GetPackagesExecute
。
在函数语言中,这被称为currying(创建一个调用另一个函数的函数,被调用的函数比创建的函数有更多的参数)。在这种情况下,匿名函数有0个参数,GetPackagesExecute
有一个参数。
从技术上讲,这个匿名函数可以返回GetPackagesExecute()
的返回值,因此它等效于两者:
void AnonymousMethod()
{
GetPackagesExecute(serviceType);
}
和
FooType AnonymousMethod()
{
return GetPackagesExecute(serviceType);
}
匿名函数的确切"类型"是由C#编译器根据GoAsync()
的签名选择的。这在lambdas中被称为类型推理。
现在,
GoAsync(() => GetPackagesExecute(serviceType));
共同意志:
- 创建一个匿名函数(它比这个稍微复杂一点…这里有一些C#编译器的魔力,但你可以忽略它)
- 为该匿名函数创建一个委托(这是隐式的,由C#编译器完成)
- 调用
GoAsync
,将此委托传递给它 GoAsync
可能会对该代表做些什么
它被称为lambda表达式。这是一个相当高级的主题,但它是一个非常核心的功能。这真的很难解释,所以我找到了这个链接供你浏览。
https://msdn.microsoft.com/en-us/library/bb397687.aspx
它会解释一切,但根据你的经验水平,它可能没有任何意义,它应该给你一个继续前进和进一步调查的障碍。