C# 调用方法的两种方法之间有什么区别?

C# 调用方法的两种方法之间有什么区别?,c#,delegates,C#,Delegates,在下面的方法中,使用 Addnew Task=>item.Execute 及 ListThreads.Addnew Taskitem.Execute 你问他们之间的区别 () => item.Execute() 及 前者是调用item.Execute的lambda。item.Execute是一个方法组。当它们被传递给Task的构造函数时,它们都被转换为Action类型的委托 不过,这有很大的不同。lambda捕获变量项。方法组没有。这意味着在执行lambda时,变量项的值可能与将lamb

在下面的方法中,使用

Addnew Task=>item.Execute

ListThreads.Addnew Taskitem.Execute


你问他们之间的区别

() => item.Execute()

前者是调用item.Execute的lambda。item.Execute是一个方法组。当它们被传递给Task的构造函数时,它们都被转换为Action类型的委托

不过,这有很大的不同。lambda捕获变量项。方法组没有。这意味着在执行lambda时,变量项的值可能与将lambda传递给任务的构造函数时的值不同

要使lambda版本等效于方法组版本,可以引入局部变量:

foreach (MyClass item in ListObjects)
{
    MyClass tmpItem = item;
    ListThreads.Add(new Task(() => tmpItem.Execute()));
    ListThreads[ListThreads.Count - 1].Start();
}
请注意,该语言已在C4.0和C5.0之间进行了修改。在C 5.0中,您问题中的代码的行为方式与上述答案中的代码完全相同。有关更多详细信息,请参阅:


首先,在lambda表达式中使用foreach变量是个坏主意。因此,在这种特殊情况下,正确的方法是编写ListThreads.Addnew Taskitem.Execute

new Task=>item.Execute和new Taskitem.Execute之间没有什么不同。这只是第一个问题,你明确地把电话写成一个Lamda,他们做的事情完全一样。。在lambda表达式中使用foreach变量的相关问题已由C5编译器解决。。。我不知道这是一个糟糕的答案,因为没有解释到底发生了什么。全局上说不应该在foreach方法中使用lambda也是不正确的。重要的是要认识到lambda是在变量上关闭的,而不是在值上关闭的,但这并不意味着你永远不会这样做,只是你很小心。在C4.0中,给定的代码不能可靠地正常工作,这是正确的,尽管dcastro在C5.0中是正确的。然而,在4.0中,循环变量的简单局部变量副本是一个足够的解决方案。如果你解释了发生了什么,这可能是一个很好的答案。谢谢你的澄清
item.Execute
foreach (MyClass item in ListObjects)
{
    MyClass tmpItem = item;
    ListThreads.Add(new Task(() => tmpItem.Execute()));
    ListThreads[ListThreads.Count - 1].Start();
}