作为 Func 参数传递的 `this.SomeMethod` 是否捕获 `this`?
Does `this.SomeMethod` passed as Func argument capture `this`?
如果一个方法要求一些 Func
:
void Foo(Func<string> stringFactory);
然后传递一个 lambda 引用 this
引入变量捕获:
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();
}
如果一个方法要求一些 Func
:
void Foo(Func<string> stringFactory);
然后传递一个 lambda 引用 this
引入变量捕获:
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();
}