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();
}