2009-11-20 11 views
2

Ceci est une question de terminologie. En C#, je peux le faire:Quel est le nom de cet usage de délégué en C#?

delegate Stream StreamOpenerDelegate(String name); 

void WorkMethod(StreamOpenerDelegate d) 
{ 
    // ... 
} 

void Exec1() 
{ 
    WorkMethod((x) => 
     { 
      return File.OpenRead(x); 
     }); 
} 

void Exec2() 
{ 
    StreamOpenerDelegate opener = (x) => 
     { 
      return File.OpenRead(x); 
     }; 

    WorkMethod(opener); 
} 

Q1
La méthode EXEC1() démontre l'utilisation d'un délégué anonyme , correct?

Q2
EXEC2 intérieur(), serait opener être considéré comme un délégué anonyme? Il ont un nom. Si ce n'est pas un délégué anonyme, comment dois-je l'appeler? Y a-t-il un nom pour cette syntaxe? "nommé délégué anonyme?" une variable locale contenant un délégué anonyme?

Répondre

15

Q1: Il n'y a pas de terme comme « délégué anonyme » (dans la spécification du langage C#) - mais utilise un lambda expression qui est une sorte de fonction anonyme. Voir la section 7.14 de la spécification de langage C# pour plus de détails.

Q2: opener est une variable. La variable reçoit une valeur créée à l'aide d'une expression lambda. Une fois créé, le délégué n'est qu'une instance de StreamOpenerDelegate. En d'autres termes, les concepts de l'expression lambda, de la fonction anonyme et de la méthode anonyme sont le code source concepts au lieu de l'exécution du temps concepts. Le CLR ne se soucie pas de savoir comment vous avez créé le délégué.

Par ailleurs, vos deux expressions lambda peut être exprimée de façon plus concise - moins entre parenthèses etc:

void Exec1() 
{ 
    WorkMethod(x => File.OpenRead(x)); 
} 

void Exec2() 
{ 
    StreamOpenerDelegate opener = x => File.OpenRead(x); 
    WorkMethod(opener); 
} 

Sinon, vous pouvez simplement utiliser une conversion de groupe Méthode :

StreamOpenerDelegate opener = File.OpenRead; 
+0

Excellent, bon à savoir, merci. – Cheeso

10

Non et non.

A1: Cette fonction est nouvelle pour C# 3.0 et est appelé une expression lambda. C# 2.0 a une caractéristique similaire appelée méthodes anonymes; par exemple:

button.Click += delegate { 
    //code 
}; 

A2: opener est une variable régulière qui arrive à maintenir une expression lambda. Par ailleurs, une expression lambda qui prend exactement un paramètre n'a pas besoin de parenthèses. En outre, une expression lambda qui consiste uniquement en une instruction return n'a pas besoin d'accolades.

Par exemple:

StreamOpenerDelegate opener = x => File.OpenRead(x); 
+0

Merci , très utile. – Cheeso