3

我看到以下声明:

ThreadStart myThreadDelegate = new ThreadStart(Work.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();

它们可以简化为以下内容吗?

Thread myThread = new Thread(new ThreadStart(Work.DoWork));
myThread.Start();

如果是,第二种方法叫什么?每种方法的优缺点是什么?

4

6 回答 6

5

它甚至可以简化为:

var myThread = new Thread(Work.DoWork);
myThread.Start();

没有太大区别。在您的第一个示例中,委托实例获得了一个名称,myThreadDelegate理论上可以稍后在方法中使用(可能用于其他用途)。

如果一个人更喜欢一个包含多个级别的长表达式,或者多个带有临时变量然后组合的小表达式,这主要是一个品味问题。

在任何情况下,在我看来,使用方法组的隐式转换,就像在 just 中一样Work.DoWork,比编写new ThreadStart(Work.DoWork). 请参阅如何:声明、实例化和使用委托(C# 编程指南)中的C# 2.0 提供了一种更简单的方法来编写前面的声明。这种更简单的方法正式称为方法组转换

有关var关键字的信息,请参阅隐式类型局部变量(C# 编程指南)

当然,您示例中的最终单线将是:

(new Thread(Work.DoWork)).Start();

在这种情况下,您甚至没有获得对新线程(变量)的引用(实例方法Start()返回void)。

于 2012-12-28T19:44:31.303 回答
5

是的。它不被称为任何东西,没有优点或缺点。您可以使用附加的 C# 语法糖:

Thread myThread = new Thread(Work.DoWork);
myThread.Start();

它会自动推断您要创建一个 ThreadStart 委托对象。

于 2012-12-28T19:44:38.150 回答
1

当然可以简化为第二种方法。但是,如果在调试期间需要其他对象,它们将不可用。他们不太可能这样做,但值得注意的是,构建更简洁的线条总是有这个缺点。

于 2012-12-28T19:44:40.860 回答
1

是的,它可以。

如果委托仅用于作为对新 Thread() 方法的引用传递,那么可以通过这种方式优化该序列 - 少一个对象声明。

于 2012-12-28T19:45:30.293 回答
1

两者都是一样的。

在第一个示例中,您有,但除了传递给Thread 构造函数myThreadDelegate之外没有其他用途。

于 2012-12-28T20:23:04.917 回答
0

好的,有人提出了这个建议,但随后删除了他/她的答案:

Thread myThread = new Thread ( () => Work.Dowork() );

那东西被称为 lambda 表达式。

于 2012-12-28T19:53:51.853 回答