C #Lambdas и область видимости переменной this

Мне интересно, могу ли я использовать ключевое слово 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хранится в памяти до тех пор, пока лямбда-выражение больше не используется?Судя по моему небольшому эксперименту, это так, но если кто-нибудь может дать более подробную информацию, мне было бы интересно.
  • Это целесообразно? Я не хочу позже попасть в ситуацию, когда этот шаблон может вызвать проблемы.

13
задан Peter Monks 19 June 2012 в 14:59
поделиться