c#线程声明



我看到以下声明:

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

可以简化如下吗?

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

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

甚至可以简化为:

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

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

是喜欢一个包含多个层次的长表达式,还是喜欢多个包含临时变量的小表达式,然后将它们组合在一起,这主要是一个品味问题。

在任何情况下,在我看来,使用方法组的隐式转换更简单,就像在Work.DoWork中一样,而不是写new ThreadStart(Work.DoWork)。参见《如何:声明、实例化和使用委托》(c#编程指南)中的句子c# 2.0提供了一种更简单的方法来编写前面的声明。这种更简单的方法在形式上称为方法组转换

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

当然,在您的示例中,最终的一行代码将是:

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

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

是。你可以使用:

使用额外的c#语法糖。
Thread myThread = new Thread(Work.DoWork);
myThread.Start();

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

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

可以。

如果委托只被用作传递给新Thread()方法的引用,那么该序列可以这样优化——少一个对象声明。

都是一样的

在第一个例子中,你有myThreadDelegate,但它除了传递给线程构造函数之外没有其他用途。

OK,有人建议这样做,但随后删除了他/她的回答:

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

这个东西叫做lambda表达式

相关内容

最新更新