Ваш пример не ясен, и (IMO) не показывает типичное использование захвата (единственное, что захватывается, это a
, что всегда 3, поэтому не очень интересно).
Рассмотрим пример из учебника (предикат):
List<Person> people = ...
string nameToFind = ...
Person found = people.Find(person => person.Name == nameToFind);
Теперь попробуйте это без закрытия; вам нужно проделать гораздо больше работы, даже если мы ленивы:
PersonFinder finder = new PersonFinder();
finder.nameToFind = ...
Person found = people.Find(finder.IsMatch);
...
class PersonFinder {
public string nameToFind; // a public field to mirror the C# capture
public bool IsMatch(Person person) {
return person.Name == nameToFind;
}
}
Подход захвата распространяется дальше на множество переменных в разных областях - много сложности, которая скрыта.
Кроме имен, вышеприведенное является приблизительным описанием того, что компилятор C # делает за кулисами. Обратите внимание, что когда задействованы дополнительные области, мы начинаем объединять различные классы захвата (т.е. внутренние области имеют ссылку на класс захвата внешних областей). Довольно сложный.
У Джона Скита есть хорошая статья по этому вопросу здесь , и больше в его книге .