c#线程声明

CaT*_*aTx 3 c# multithreading delegates declaration

我看到以下声明:

ThreadStart myThreadDelegate = new ThreadStart(Work.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
Run Code Online (Sandbox Code Playgroud)

他们可以简化如下吗?

Thread myThread = new Thread(new ThreadStart(Work.DoWork));
myThread.Start();
Run Code Online (Sandbox Code Playgroud)

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

Jep*_*sen 5

它甚至可以简化为:

var myThread = new Thread(Work.DoWork);
myThread.Start();
Run Code Online (Sandbox Code Playgroud)

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

如果一个人喜欢一个含有多个级别的长表达式,或者许多带有temporaray变量的小表达式然后被组合,那么这主要是一个品味问题.

在任何情况下,在我看来,使用方法组的隐式转换比较简单,而Work.DoWork不是写入new ThreadStart(Work.DoWork).看到一句C#2.0提供了编写与先前的声明更简单的方式如何:声明,实例化和使用委托(C#编程指南).这种更简单的方法正式称为方法组转换.

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

当然,你的例子中的终极单行将是:

(new Thread(Work.DoWork)).Start();
Run Code Online (Sandbox Code Playgroud)

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


Han*_*ant 5

是.它没有被称为任何东西,没有任何利弊.您可以使用额外的C#语法糖:

Thread myThread = new Thread(Work.DoWork);
myThread.Start();
Run Code Online (Sandbox Code Playgroud)

它会自动推断您要创建ThreadStart委托对象.