我正在阅读有关Web API 2和实体框架的内容,其中我碰到了这一行:
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
我查了=>
运算符,发现它与lambdas有关,虽然我还不确定它究竟是如何适应或者在这里发生了什么。有人可以帮帮我吗?这一行发生了什么?
答案 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>
类型,是委托类型
因此,当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);
}