为什么即使没有构造函数重载似乎都允许new Thread()接受方法名称? [重复]
收藏

可能重复:
What is the difference between new Thread(void Target()) and new Thread(new ThreadStart(void Target()))?
我有一个关于线程类的小问题。这个类有4个构造函数:

public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);

我使用第二个构造函数创建线程对象:
Thread thread = new Thread(new ThreadStart(ScanDirectory));

但是,我可以使用一种方法来创建这个对象,而不使用上面提到的任何构造函数。
Thread thread = new Thread(ScanDirectory);

在本例中,scandirectory是一个void方法,它不是threadstart或parametedthreadstart,但是thread类仍然接受这个构造函数。为什么?
我认为这是一个.NET特性,但我不知道它是如何实现的。
注意:scandirectory是一种无效的方法。


最佳答案:

这里有两件事很重要:
Thread构造函数的调用
创建委托以传递给Thread构造函数
你真的对后者很感兴趣-区别在于:

ThreadStart tmp = new ThreadStart(ScanDirectory);


ThreadStart tmp = ScanDirectory;

第二个是方法组转换—从方法组(方法的名称,如果是实例方法,则可能由实例值限定)到具有兼容签名的委托的隐式转换。
您很少需要第一种形式的“显式”委托创建表达式,因为方法组转换是在C 2中引入的。您将看到许多仍然使用它的代码,因为许多开发人员不知道方法组转换,不幸的是-IIRC 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)
{
}

    公众号
    关注公众号订阅更多技术干货!