2009-02-26 1 views
18

J'ai collé un code de C de # Jon Skeet Dans le site de la profondeur:Que signifie() dans une expression lambda lors de l'utilisation d'Actions?

static void Main() 
{ 
    // First build a list of actions 
    List<Action> actions = new List<Action>(); 
    for (int counter = 0; counter < 10; counter++) 
    { 
     actions.Add(() => Console.WriteLine(counter)); 
    } 

    // Then execute them 
    foreach (Action action in actions) 
    { 
     action(); 
    } 
} 

http://csharpindepth.com/Articles/Chapter5/Closures.aspx

Avis de la ligne:

actions.Add (()

Qu'est-ce que le() signifie à l'intérieur des parenthèses?

J'ai vu plusieurs exemples d'expressions lambda, délégués, l'utilisation de la Objet d'action, etc mais je n'ai vu aucune explication de cette syntaxe. Qu'est ce que ça fait? Pourquoi est-ce nécessaire?

Répondre

31

Ceci est un raccourci pour déclarer une expression lambda qui ne prend pas d'arguments.

() => 42; // Takes no arguments returns 42 
x => 42; // Takes 1 argument and returns 42 
(x) => 42; // Identical to above 
+0

dang syntaxe accentuant bug buggée – Will

+0

@Will merci, je travaille dans de nombreuses langues sur une base quotidienne – JaredPar

+2

'()' Est obligatoire lorsque vous avez besoin de masse plus d'un paramètre: '(x, y) => x * y' – istepaniuk

5

C'est une expression lambda sans paramètres.

1

Il indique une fonction anonyme sans paramètre.

2

De MSDN. Une expression lambda prend la forme (entrées) => expression. Donc une expression lambda like() => indique qu'il n'y a pas de paramètres d'entrée. La signature de Action ne prend aucun paramètre

2

Ce que fait cette ligne est d'ajouter une Action anonyme à la liste en utilisant les expressions lambda, qui ne prend aucun paramètre (c'est la raison pour laquelle le() est là) et ne renvoie rien, en raison de le fait qu'il imprime uniquement la valeur réelle du compteur.

3

je pense à lambas comme ceci:

(x) => {return x * 2; }

Mais seulement ce qui est important:

(x) => {return x * 2; }

Nous avons besoin de => pour savoir que c'est un lambda au lieu de la coulée, et donc nous obtenons ceci:

x => x * 2

(désolé pour ne pas le formatage du code code, qui est parce que vous ne pouvez pas mettre les choses en gras dans le code ..)