在C#中,实际上,我没有观察到以下内容之间的任何区别:
new Thread(SomeMethod).Start();
new Thread(new ParameterizedThreadStart(SomeMethod));
和
new Thread(new ThreadStart(SomeMethod));
有没有任何区别?如果有,是什么区别?
在C#中,实际上,我没有观察到以下内容之间的任何区别:
new Thread(SomeMethod).Start();
new Thread(new ParameterizedThreadStart(SomeMethod));
和
new Thread(new ThreadStart(SomeMethod));
有没有任何区别?如果有,是什么区别?
Thread(ThreadStart)
构造函数只能在您的 SomeMethod
方法的签名与 ThreadStart
委托匹配时使用。相反,Thread(ParameterizedThreadStart)
要求 SomeMethod
匹配 ParameterizedThreadStart
委托。签名如下:
public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)
具体而言,这意味着当您的方法不需要任何参数时,应使用 ThreadStart
,而当它需要单个 Object
参数时,应使用 ParameterizedThreadStart
。使用前者创建的线程应通过调用 Start()
启动,而使用后者创建的线程应通过 Start(Object)
指定其参数。
public static void Main(string[] args)
{
var threadA = new Thread(new ThreadStart(ExecuteA));
threadA.Start();
var threadB = new Thread(new ParameterizedThreadStart(ExecuteB));
threadB.Start("abc");
threadA.Join();
threadB.Join();
}
private static void ExecuteA()
{
Console.WriteLine("Executing parameterless thread!");
}
private static void ExecuteB(Object obj)
{
Console.WriteLine($"Executing thread with parameter \"{obj}\"!");
}
最后,你可以调用Thread
构造函数而不必指定ThreadStart
或ParameterizedThreadStart
委托。在这种情况下,编译器将根据方法签名将其与构造函数重载进行匹配,并隐式地执行转换。
var threadA = new Thread(ExecuteA); // implicit cast to ThreadStart
threadA.Start();
var threadB = new Thread(ExecuteB); // implicit cast to ParameterizedThreadStart
threadB.Start("abc");
new Thread(SomeMethod)
和new Thread(new ThreadStart(SomeMethod))
:new Thread(SomeMethod)
和new Thread(new ThreadStart(SomeMethod))
之间的区别纯粹是语法上的:C#编译器为这两者生成相同的代码,前者是后者的缩写。
(编译器可以根据可用的Thread
构造函数的签名和指定方法SomeMethod
的签名自动推断出要使用的适当委托类型。写出new ThreadStart(…)
而不仅仅是…
有点像用实际表达式的实际类型替换var
,你让编译器免去了找出实际类型的工作。)
这两个版本在SomeMethod
不带参数时起作用,因为这是与ThreadStart
委托匹配所需的签名。
new Thread(new ParameterizedThreadStart(SomeMethod))
:上述两者和new Thread(new ParameterizedThreadStart(SomeMethod))
之间的区别在于这个调用了Thread
的另一个构造函数。
ParameterizedThreadStart
规定了与ThreadStart
不同的方法签名:你的SomeMethod
需要接受一个类型为object
的参数,否则它就不匹配这个委托类型。