我最近发现了这样一个代码片段(下面是我检查过并且可行的简化版本):
using System;
using System.Threading;
namespace Rextester
{
public class Program
{
public class Foo
{
public Foo()
{
thread = new Thread(new ThreadStart(Loop));
}
private void Loop()
{
}
private Thread thread;
}
public static void Main(string[] args)
{
var foo = new Foo();
Console.WriteLine("How does it work??");
}
}
}
为什么这样的代码可以在编译器没有任何投诉的情况下工作?据我所知,线程应该从静态函数开始。(或者无论如何都应该传递对象引用和成员函数)。但是在这里,我只看到了对成员函数的引用。似乎我在c#中错过了一件大事。也许有一种隐式的方法传递“this”引用?
更新:非常感谢。我只想添加这个事实的小补充。事实证明,编译器自动处理委托(传递正确的引用对象和方法)。以下是il代码:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 32 (0x20)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.0
IL_000a: ldftn instance void Rextester.Program/Foo::Loop()
IL_0010: newobj instance void
[mscorlib]System.Threading.ThreadStart::.ctor(object,
native int)
IL_0015: newobj instance void
[mscorlib]System.Threading.Thread::.ctor(class
[mscorlib]System.Threading.ThreadStart)
IL_001a: stfld class [mscorlib]System.Threading.Thread
Rextester.Program/Foo::thread
IL_001f: ret
} // end of method Foo::.ctor
Loop
作为参数是一个 委托(意味着编译器将负责正确地调用它,例如如果它是实例成员,则使用this
),它不必是静态的。 - Sinatr