我看到以下声明:
ThreadStart myThreadDelegate = new ThreadStart(Work.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
它们可以简化如下吗?
Thread myThread = new Thread(new ThreadStart(Work.DoWork));
myThread.Start();
如果是,第二种方法叫什么?每种方法的优点和缺点是什么?
答案 0 :(得分:5)
它甚至可以简化为:
var myThread = new Thread(Work.DoWork);
myThread.Start();
没有多大区别。在您的第一个示例中,委托实例获得一个名称myThreadDelegate
,理论上可以在该方法中稍后使用(可能是其他内容)。
如果你喜欢一个含有多个级别的长表达式,或许多带有临时变量的小表达式,那么这主要是一种品味问题。
在任何情况下,在我看来,使用方法组的隐式转换比在Work.DoWork
中更简单,而不是写new ThreadStart(Work.DoWork)
。查看句子 C#2.0提供了一种更简单的方法来编写How to: Declare, Instantiate, and Use a Delegate (C# Programming Guide)中的上一个声明。这种更简单的方法正式称为方法组转换。
有关var
关键字的信息,请参阅Implicitly Typed Local Variables (C# Programming Guide)。
当然,你的例子中的终极单行将是:
(new Thread(Work.DoWork)).Start();
在这种情况下,您甚至没有获得对新线程(变量)的引用(实例方法Start()
返回void
)。
答案 1 :(得分:5)
是。它没有被称为任何东西,没有任何利弊。您可以使用其他C#语法糖:
Thread myThread = new Thread(Work.DoWork);
myThread.Start();
它会自动推断你想要创建一个ThreadStart委托对象。
答案 2 :(得分:1)
当然可以简化为第二种方法。但是,如果在调试期间需要其他对象,则它们将不可用。它们不太可能,但值得注意的是,构建更简洁的线条总是有这个缺点。
答案 3 :(得分:1)
是的,它可以。
如果委托仅用于作为对新Thread()方法的引用,那么该顺序可以通过这种方式进行优化 - 少一个对象声明。
答案 4 :(得分:1)
两者都是一样的。
在第一个示例中,您有myThreadDelegate
但除了传递给Thread constructor之外没有其他用法。
答案 5 :(得分:0)
行, 有人建议这样做但后来删除了他/她的答案:
Thread myThread = new Thread ( () => Work.Dowork() );
那个东西叫做lambda表达式。