调用方法的两种方法有什么区别?

时间:2014-05-14 13:56:53

标签: c# delegates

在下面的方法中,使用

之间的区别是什么

ListThreads.Add(new Task(() => item.Execute()));

ListThreads.Add(new Task(item.Execute));

private void Execute()
{
    for (int i = 0; i < ThreadNumber; i++)
    {
        ListObjects.Add(new MyClass(i + 1, ThreadNumber));
    }
    foreach (MyClass item in ListObjects)
    {
        ListThreads.Add(new Task(() => item.Execute()));
        ListThreads[ListThreads.Count - 1].Start();
    }
    Task.WaitAll(ListThreads.ToArray());
}

2 个答案:

答案 0 :(得分:3)

你问的是

之间的区别
() => item.Execute()

item.Execute

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

但是有很大的不同。 lambda捕获变量item。方法组没有。这意味着当执行lambda时,变量item的值可能与将lambda传递给Task的构造函数时的值不同。

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

foreach (MyClass item in ListObjects)
{
    MyClass tmpItem = item;
    ListThreads.Add(new Task(() => tmpItem.Execute()));
    ListThreads[ListThreads.Count - 1].Start();
}

请注意,语言已在C#4.0和C#5.0之间进行了修改。在C#5.0中,您的问题中的代码与本答案中上面的代码完全相同。有关详细信息,请参阅:

答案 1 :(得分:-2)

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