这意味着什么GoAsync(()=>;GetPackagesExecute(serviceType));在C#中

本文关键字:serviceType GetPackagesExecute 什么 意味着 GoAsync gt | 更新日期: 2023-09-27 17:59:12

我有一段这样的代码:

GoAsync(() => GetPackagesExecute(serviceType));

如何理解此代码?,什么是没有name方法的大括号?

这意味着什么GoAsync(()=>;GetPackagesExecute(serviceType));在C#中

很难准确地告诉您这些方法的作用,因为它们不是"标准"方法。。。

例如,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

它会解释一切,但根据你的经验水平,它可能没有任何意义,它应该给你一个继续前进和进一步调查的障碍。