10

私は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) 閉鎖によって得られる利点は何ですか?

4

1 に答える 1

7

はい、内部のコードは、ラムダ式内の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);
}

これらはすべて、デリゲート内でパラメーターを使用するという概念を表現するためのものです。

于 2010-03-27T08:14:23.557 に答える