我测试了以下代码行(当然不是同时进行),据我所知,它们实现了相同的结果。作为一个谨慎的人,我可以想象他们做事的方式/方式之间存在差异,但由于缺乏适当的观察样本,我对此一无所知。
Thread whee = new Thread((ThreadStart)delegate { someObject.Start(); });
Thread whoo = new Thread(someObject.Start);
Thread whaa = new Thread(() => { someObject.Start(); });
如果有的话,上面的区别是什么?这些信息是否可能在某处几乎一目了然的地方可用,而我由于困惑而错过了它?!
第一次和第三次调用是完全一样的。关于另外两个:
//Thread whee = new Thread((ThreadStart)delegate { someObject.Start(); });
//or, using a lambda expression,
Thread whee = new Thread(() => someObject.Start());
Thread whoo = new Thread(someObject.Start);
在第一个中,您创建一个委托(delegate)来关闭(或捕获)someObject
变量。当线程调用您的委托(delegate)时,它将评估变量指向哪个对象,并对其调用 Start
。
在第二个中,someObject
被急切求值。
Thread whee = new Thread(() => someObject.Start());
Thread whoo = new Thread(someObject.Start);
someObject = someOtherObject;
whee.Start();
whoo.Start();
如果在启动线程之前将新对象分配给 someObject
变量,您会注意到:
- 第一个线程在
someOtherObject
上调用 Start
,因为闭包变量是延迟计算的。
- 第二个线程在
someObject
指向的原始实例上调用 Start
,因为该变量已被提前求值。