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

C# 作为Func参数传递的`this.SomeMethod`是否捕获`this`?,c#,lambda,delegates,capture,func,C#,Lambda,Delegates,Capture,Func,如果一个方法要求一些Func: void Foo(Func<string> stringFactory); 当传递实例方法而不是lambda时,是否也会发生这种情况 Foo(this.GetMagicString); // Capturing?? string GetMagicString() { return "Bar"; } 如果是这样的话,这是否编译成与lambda版本类似的东西 如果没有,它如何同时传递方法(存在于某个地方)和实例(存在于其他地方)?此不必在闭包

如果一个方法要求一些
Func

void Foo(Func<string> stringFactory);
当传递实例方法而不是lambda时,是否也会发生这种情况

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

string GetMagicString()
{
    return "Bar";
}
如果是这样的话,这是否编译成与lambda版本类似的东西


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

不必在闭包中捕获。调用之间的区别在于有一个编译器生成的方法用于
()=>this.MagicStringProperty()
。此方法只调用
This.GetMagicString()

如果反编译代码,您将看到
Foo(this.GetMagicString)
转换为
this.Foo(new-Func((object)this,u-methodptr(GetMagicString))
Foo(()=>this.GetMagicString())
转换为
this.Foo(new-Func((object)this,u-methodptr(b_u1_0)))
其中
b\uu 1\u 0
是编译器生成的方法,它调用
this.GetMagicString()

[编译生成]
私有字符串b__1_0()
{
返回这个.GetMagicString();
}

因此,如果我理解正确,将构造一个
Func
,其中包含对
this
的引用和对方法的引用?这是否也意味着每次调用都会执行分配,
newfunc(…)
?@Timo:是的,是的。谢谢。这实际上相当令人失望。我想知道他们是否能用一个结构简单地做到这一点。。。
Foo(this.GetMagicString); // Capturing??

string GetMagicString()
{
    return "Bar";
}
[CompilerGenerated]
private string <.ctor>b__1_0()
{
  return this.GetMagicString();
}