Передается ли this.SomeMethod в качестве аргумента Func для захвата this? - PullRequest
1 голос
/ 12 марта 2019

Если метод запрашивает некоторую Func:

void Foo(Func<string> stringFactory);

Затем передача лямбда-ссылки this вводит захват переменной:

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

Это также происходит при передачеметод экземпляра вместо лямбды?

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

string GetMagicString()
{
    return "Bar";
}

Если да, скомпилировано ли это с аналогом лямбда-версии?

Если нет, как ему удается передать оба метода (который существует где-то) и экземпляр (который существует где-то еще)?

1 Ответ

1 голос
/ 12 марта 2019

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