我有一个简单的程序来启动线程。作为线程的参数,我传递了ParameterizedThreadStart委托。直到这里一切都很好。现在,当我启动线程时,我需要向其传递一个必需的对象,但是令人惊讶的是,它在没有任何对象的情况下都能正常工作!怎么会来?
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(new ParameterizedThreadStart(F1));
thread.Start(); //Why does it work with out passing any argument?
Console.ReadLine();
}
public static void F1(object obj)
{
Console.WriteLine("Hello");
}
}
程序显示Hello,我希望得到一个错误。
这是预期的行为。 Start将使用其参数调用该方法,如果未获取任何参数,它将使用每个参数的默认值调用该方法。并且因为您没有以任何可能导致其默认值发生异常的方式使用obj
,所以没有任何东西会引发异常。
在您的示例中,obj
始终为null,但是由于您未对其进行任何操作,因此它不会引发异常。让我们尝试一下:
static void Main(string[] args)
{
Thread thread = new Thread(new ParameterizedThreadStart(F1));
thread.Start(); // Will throw a null reference exception
Console.ReadLine();
}
public static void F1(string obj)
{
Console.WriteLine("String passed has a length of: " + obj.Length);
}
这将引发null引用异常,因为string
的默认值为null。这是哪里:
thread.Start("Hello World");
将打印String passed has a length of: 11
您的代码必须有效,并将null
值传递到方法F1
中。 MSDN Thread.Start()
中记录了此行为:
如果此重载与使用
MSDN Thread.Start()
委托,ParameterizedThreadStart
传递给方法由线程执行。
您需要调用带有参数的null
重载:例如:
Thread.Start
您正在调用的thread.Start("Hello world");
方法将导致Start传递给线程函数:
如果此重载与使用ParameterizedThreadStart委托,将null传递给方法由线程执行。