这条线是什么? X = Y => Z(Y)

时间:2016-05-17 03:23:14

标签: c# asp.net .net asp.net-mvc entity-framework

我正在阅读有关Web API 2和实体框架的内容,其中我碰到了这一行:

this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

我查了=>运算符,发现它与lambdas有关,虽然我还不确定它究竟是如何适应或者在这里发生了什么。有人可以帮帮我吗?这一行发生了什么?

3 个答案:

答案 0 :(得分:3)

this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

基本上意味着:

this.Database.Log = blah;
void blah(string s)
{
    System.Diagnostics.Debug.WriteLine(s);
}

Database.Log属于Action<T>类型,是委托类型

See the property on MSDN

See Action<T> on MSDN

See delegates on MSDN

See lamdas on MSDN

因此,当this.Database想要记录内容时,它会将其称为“Log”属性,即Action<string>。由于它是Action<string>(更重要的是,Action<T>是委托类型),您可以指定一个不返回任何值并且具有单个参数(这是一个字符串)的方法或一个带有一个参数的lamda单个参数(也是字符串)(并且没有返回值)。

答案 1 :(得分:2)

Database.Log属性的类型为Action<string>。这意味着它是一个delegate,它接受​​一个字符串并且没有返回值(即它的返回类型是void)。因此,该行为Log属性分配一个匿名函数,该函数接受string值并将其写入调试器窗口。

因为您将lambda表达式分配给具有已知委托类型的属性,所以编译器可以推断出参数的类型(s)并从上下文返回类型。这是

的简写
this.Database.Log = (delegate (string s){ System.Diagnostics.Debug.WriteLine(s); });

这反过来又是(如其他答案提及的)创建私有方法并为该私有方法分配委托引用的简写:

this.Database.Log = (Action<string>)__compiler_generated_function__;

private void __compiler_generated_function__(string s) {
    System.Diagnostics.Debug.WriteLine(s);
}

答案 2 :(得分:1)

这意味着将功能分配给this.Database.Log。当this.Database.Log执行时,它会找到函数

s => System.Diagnostics.Debug.WriteLine(s);

代表

void LogMethod(string s)
{
  System.Diagnostics.Debug.WriteLine(s);
}