为什么新的Thread()接受方法名称,即使没有构造函数重载似乎允许这样做?

Leo*_* Vo 6 .net c#

可能重复:
新的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方法.

Jon*_*eet 9

在这里分开两件事很重要:

  • 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 次

最近记录:

13 年,2 月 前