Мне интересно, могу ли я использовать ключевое слово this
внутри С# лямбда, хотя на самом деле я знаю, что могу, но я хочу, чтобы убедиться, что это не так, или позже вы получите тонкие проблемы.
Прочитав правила область переменных для lambdas, я вижу, что:
Перехваченная переменная не будет собираться мусором до тех пор, пока делегат, который ссылается на него, выходит за рамки.
Итак, это заставляет меня предположить, что экземпляр объекта (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<string> name)
{
this.name = name;
}
public int ID { get; set; }
private Lazy<string> 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<string>(
() => this.GetName() // <--- This I'm not sure on...
)
);
person.ID = id;
return person;
}
public string GetName()
{
return "John Smith";
}
}
Это выполняется и дает мне правильный результат, поэтому доступ к this
изнутри лямбда явно работает. Однако я хочу проверить:
- Выполняет ли это те же правила области видимости переменных, что и локальные переменные, что означает, что ссылка
this
хранится в памяти до тех пор, пока лямбда больше не будет использоваться? Это было бы так из моего небольшого эксперимента, но если кто-то может дать более подробную информацию, мне было бы интересно. - Это целесообразно? Я не хочу вдаваться в ситуацию позже, когда этот шаблон может вызвать проблемы.