C # -Закрытие -Очистка - PullRequest
       47

C # -Закрытие -Очистка

9 голосов
/ 27 марта 2010

Я изучаю C #. Могу ли я обозначить закрытие как a construct that can adopt the changes in the environment in which it is defined.

Пример:

List<Person> gurus = 
new List<Person>()
                 {
                  new Person{id=1,Name="Jon Skeet"},
                  new Person{id=2,Name="Marc Gravell"},
                  new Person{id=3,Name="Lasse"}
                 };            


void FindPersonByID(int id)
{
  gurus.FindAll(delegate(Person x) { return x.id == id; }); 
}

Переменная id объявлена ​​в области действия FindPersonByID (), но мывсе еще может обращаться к локальной переменной id внутри анонимной функции (то есть) delegate(Person x) { return x.id == id; }

(1) Правильно ли мое понимание замыкания?

(2) Какие преимущества могутмы получаем от закрытия?

1 Ответ

6 голосов
/ 27 марта 2010

Да, код внутри FindPersonByID использует закрытие, используя параметр id в лямбда-выражении. Строго говоря, определения замыканий немного сложнее, но на базовом уровне это правильно. Если вам нужна дополнительная информация о том, как они функционируют, я рекомендую вам прочитать следующие статьи

Основным преимуществом замыканий является то, что вы продемонстрировали выше. Это позволяет вам писать код более естественным и понятным способом, не беспокоясь о деталях реализации того, как генерируется лямбда-выражение (обычно)

Рассмотрим, например, сколько кода вам нужно написать при отсутствии замыканий

class Helper {
  private int _id;
  public Helper(int id) { 
    _id = id;
  }
  public bool Filter(Person p) {
    return p.id == _id;
  }
}

void FindPersonsByID(int id) {
  Helper helper = new Helper(id);
  gurus.FindAll(helper.Filter);
}

Все это просто для того, чтобы выразить концепцию использования параметра внутри делегата.

...