如果一个方法要求一些Func
:
void Foo(Func<string> stringFactory);
然后传递引用this
的lambda引入变量捕获:
Foo(() => this.MagicStringProperty); // Captures `this`
传递实例方法而不是lambda时是否也会发生这种情况?
Foo(this.GetMagicString); // Capturing??
string GetMagicString()
{
return "Bar";
}
如果是这样,这是否编译成与lambda版本类似的东西?
如果没有,它如何设法传递方法(存在于某处)和实例(存在于其他地方)?
this
不必在这里关闭。调用之间的区别在于() => this.MagicStringProperty()
有一个编译器生成的方法。这种方法只需要调用this.GetMagicString()
。
如果您反编译代码,您将看到Foo(this.GetMagicString)
转换为this.Foo(new Func<string>((object) this, __methodptr(GetMagicString)))
并且Foo(() => this.GetMagicString())
转换为this.Foo(new Func<string>((object) this, __methodptr(<.ctor>b__1_0)))
,其中<.ctor>b__1_0
是编译器生成的方法,调用this.GetMagicString()
:
[CompilerGenerated]
private string <.ctor>b__1_0()
{
return this.GetMagicString();
}