2010-03-27 7 views
7

estoy aprendiendo C# .Can quiero decir que el cierre a construct that can adopt the changes in the environment in which it is defined.C# -Cierre -Clarification

Ejemplo:

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; }); 
} 

La variable id se declara en el ámbito de FindPersonByID() t pero que todavía se puede acceder la variable local id dentro de la función anónima (es decir) delegate(Person x) { return x.id == id; }

(1) ¿es mi comprensión de cierre es correcto?

(2) ¿Cuáles son las ventajas podemos obtener de cierres?

Respuesta

5

Sí, el código dentro de FindPersonByID aprovecha un cierre utilizando el parámetro id dentro de la expresión lambda. Estrictamente hablando, las definiciones de cierres son un poco más complejas, pero en un nivel básico esto es correcto. Si desea más información sobre cómo funcionan os animo a leer los artículos siguientes

La principal ventaja de los cierres es esencialmente lo que se demostró anteriormente. Le permite escribir el código de una manera más natural y directa sin tener que preocuparse por los detalles de implementación de cómo se genera la expresión lambda (generalmente)

Considere por ejemplo la cantidad de código que tendría que escribir en el ausencia de cierres

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); 
} 

Todo esto para expresar el concepto de usar un parámetro dentro de un delegado.

+0

Gran explicación Sr. jaredpar – user274364