c#线程声明
本文关键字:声明 线程 | 更新日期: 2023-09-27 17:49:56
我看到以下声明:
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表达式