可能重复:
新的Thread(void Target())和新的Thread(新的ThreadStart(void Target())之间有什么区别?)
我有一个关于Thread类的小问题.这个类有4个构造函数:
public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);
Run Code Online (Sandbox Code Playgroud)
我使用第二个构造函数来创建一个Thread对象:
Thread thread = new Thread(new ThreadStart(ScanDirectory));
Run Code Online (Sandbox Code Playgroud)
但是,我可以使用一种方法来创建这个对象,而不使用我上面提到的任何构造函数.
Thread thread = new Thread(ScanDirectory);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ScanDirectory是一个void方法,它不是ThreadStart或ParameterizedThreadStart,但Thread类仍然接受此构造函数.为什么?我认为这是一个.NET功能,但我不知道它是如何实现的.
注意: ScanDirectory是一种void方法.
在这里分开两件事很重要:
Thread构造函数的调用Thread构造函数你真的对后者感兴趣 - 两者之间的区别:
ThreadStart tmp = new ThreadStart(ScanDirectory);
Run Code Online (Sandbox Code Playgroud)
和
ThreadStart tmp = ScanDirectory;
Run Code Online (Sandbox Code Playgroud)
其中第二个是方法组转换 - 从方法组(方法的名称,可能由实例值限定,如果它是实例方法)到具有兼容签名的委托的隐式转换.
您很少需要第一个表单的"显式"委托创建表达式,因为方法组转换是在C#2中引入的.您将看到许多仍然使用它的代码,因为许多开发人员不知道方法组转换,不幸的是 - Visual Studio设计人员仍然使用该表单进行事件处理程序订阅.
您真正需要它的唯一时间是方法组转换最终变得模棱两可.例如:
static void Main()
{
// Valid: uses parameterless overload
new Thread(new ThreadStart(Foo));
// Valid: uses parameterized overload
new Thread(new ParameterizedThreadStart(Foo));
// Invalid, as there are two valid constructor overloads
new Thread(Foo);
}
static void Foo()
{
}
static void Foo(object state)
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1149 次 |
| 最近记录: |