繁体   English   中英

两种调用方法的方法有何区别?

[英]What is the difference between the two ways to invoke the method?

在下面的方法中,使用之间有什么区别

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());
}

你问之间的区别

() => 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中,您问题中的代码的行为与此答案中以上代码的行为完全相同。 有关更多详细信息,请参见:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM