Мне интересно, могу ли я использовать ключевое слово this
внутри лямбды C #, хотя на самом деле я знаю , что могу, но я хочу убедиться, что это не плохо и не приведет к тонкие вопросы позже.
Прочитав правила области видимости для лямбда-выражений , я вижу, что:
A variable that is captured will not be garbage-collected until the delegate that references it goes out of scope.
Таким образом, это приводит меня к предположению, что экземпляр объекта(this
)также будет захвачен. Чтобы проверить это, я написал этот надуманный пример, к которому я хочу приблизительно стремиться в моем реальном коде -, написанном на LINQPad, поэтому у меня есть вызовы метода Dump()
:
void Main()
{
Repository repo = new Repository();
Person person = repo.GetPerson(1);
person.ID.Dump("Person ID - Value Assigned");
person.Name.Dump("Person Name - Lazily Created");
}
class Person
{
public Person(Lazy name)
{
this.name = name;
}
public int ID { get; set; }
private Lazy name;
public string Name
{
get { return name.Value; }
}
}
class Repository
{
public Person GetPerson(int id)
{
// Setup person to lazily load a name value
Person person = new Person(
new Lazy(
() => this.GetName() // <--- This I'm not sure on...
)
);
person.ID = id;
return person;
}
public string GetName()
{
return "John Smith";
}
}
Это запускается и дает мне правильный вывод, поэтому доступ к this
из лямбды явно работает. Что я хочу проверить, так это:
this
хранится в памяти до тех пор, пока лямбда-выражение больше не используется?Судя по моему небольшому эксперименту, это так, но если кто-нибудь может дать более подробную информацию, мне было бы интересно.