这个GoAsync是什么意思(()=> GetPackagesExecute(serviceType));在C#?

时间:2015-06-23 09:51:12

标签: c#

我有一段这样的代码:

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

如何理解这段代码?,没有名称方法的大括号是什么意思?

2 个答案:

答案 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));

将一起:

  • 创建一个匿名函数(它比这复杂一点......这里有一些C#compiler-magic,但你可以忽略它)
  • 创建该匿名函数的委托(这是隐式的,由C#编译器完成)
  • 致电GoAsync将此代表传递给它
  • GoAsync可能会对委托
  • 执行某些操作

答案 1 :(得分:0)

这是一种叫做lambda表达式的东西。这是一个相当高级的主题,但它是一个非常核心的功能。很难解释这一切所以我找到了这个链接供你查看。

https://msdn.microsoft.com/en-us/library/bb397687.aspx

它会解释一切,但是根据你的经验水平它可能没有任何意义,它应该给你一个跳跃块继续前进并进行调查。