Lambda表达语法糖?

tom*_*ing 5 c# lambda syntactic-sugar

我刚刚遇到以下代码(.NET 3.5),它看起来不应该编译给我,但确实如此,并且工作正常:

bool b = selectedTables.Any(table1.IsChildOf));
Run Code Online (Sandbox Code Playgroud)

Table.IsChildOf实际上是一个具有以下签名的方法:

public bool IsChildOf(Table otherTable)
Run Code Online (Sandbox Code Playgroud)

我认为这相当于:

bool b = selectedTables.Any(a => table1.IsChildOf(a));
Run Code Online (Sandbox Code Playgroud)

如果是这样,那么适当的术语是什么?

Jon*_*eet 13

这是一个方法组转换,它从C#2开始就可用.作为一个更简单的例子,请考虑:

public void Foo()
{
}

...

ThreadStart x = Foo;
ThreadStart y = new ThreadStart(Foo); // Equivalent code
Run Code Online (Sandbox Code Playgroud)

请注意,这与lambda表达式版本完全相同,后者将捕获变量 table1,并使用仅调用的方法生成新类IsChildOf.对于Any不是很重要,但差异为重要Where:

var usingMethodGroup = selectedTables.Where(table1.IsChildOf);
var usingLambda = selectedTables.Where(x => table1.IsChildOf(x));
table1 = null;

// Fine: the *value* of `table1` was used to create the delegate
Console.WriteLine(usingMethodGroup.Count());

// Bang! The lambda expression will try to call IsChildOf on a null reference
Console.WriteLine(usingLambda.Count());
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 5

该表达式table1.IsChildOf称为方法组.

你是对的,它是等价的,这确实是语法糖.

  • @Jon和@Jon,Resharper曾经有一个陷入Skeet先生指出的确切陷阱的错误.`Event1 + =(o,e)=> Event2(o,e);`将"链接"事件,导致`Event2`在`Event1`触发时触发.但Resharper很乐意建议替代的`Event1 + = Event2`,这是完全不同的:它立即将'Event2`中的任何处理程序*当前*复制到`Event1`列表中.通常结果是事件不会按预期传递(因为`Event2`在复制发生时可能仍然是一个空列表). (3认同)
  • 它并不是真正等价的 - 因为任何结果都是相同的(除非有另一个线程涉及改变table1的值),但总的来说可能存在显着差异.请参阅我的答案以获取示例. (2认同)