`this.SomeMethod`是否作为Func参数传递捕获`this`?

问题描述 投票:1回答:1

如果一个方法要求一些Func

void Foo(Func<string> stringFactory);

然后传递引用this的lambda引入变量捕获:

Foo(() => this.MagicStringProperty); // Captures `this`

传递实例方法而不是lambda时是否也会发生这种情况?

Foo(this.GetMagicString); // Capturing??

string GetMagicString()
{
    return "Bar";
}

如果是这样,这是否编译成与lambda版本类似的东西?

如果没有,它如何设法传递方法(存在于某处)和实例(存在于其他地方)?

c# lambda delegates capture func
1个回答
1
投票

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.