53 votes

Je veux comprendre l'expression lambda dans @ Html.DisplayFor (modelItem => item.FirstName)

Je suis assez nouveau sur le C# et MVC, et ont utilisé des lambdas, à certaines occasions, comme pour les méthodes anonymes et sur LINQ.

Généralement je vois les expressions lambda qui ressemble à quelque chose comme ceci:

(x => x.Name), (x => { Console.WriteLine(x))

Je comprends que lambda = "va". Je n'ai jamais vu une expression lambda, où la gauche paramètre n'est pas utilisé.

Je ne sais pas comment traduire cette expression lambda si

@Html.DisplayFor(modelItem => item.FirstName)

Quelqu'un peut-il éclairer sur ce pour moi? Ne devrait-ce pas être

(modelItem => modelItem.FirstName)?

J'ai obtenu ce à partir de Microsoft Introduction à ASP.NET MVC tutoriel.

103voto

zespri Points 6865

Une expression lambda est une manière d'écrire une fonction anonyme, c'est à dire une fonction sans nom. Ce que vous avez sur le côté gauche de la "flèche" sont des paramètres de la fonction, et ce que vous avez sur le côté droit sont le corps de la fonction. Ainsi, (x => x.Name) logiquement se traduit par quelque chose comme string Function(Data x) { return x.Name } types string et Data va évidemment varier et être dérivée à partir du contexte.

L'absence de la gauche du paramètre se traduit par une fonction sans paramètres, de sorte que ce (() => someVariable) logiquement se traduit par ceci: string Function() { return someVariable; }

À ce stade, vous pourriez commencer à se demander, où someVariable vient, ce n'est pas un paramètre de la fonction et il n'est pas défini dans la fonction. Vous auriez raison, une fonction comme ce ne serait jamais le compiler. Cependant, la fonction lambda comme ce qui est parfaitement correct, car il permet à l'extérieure de la portée des variables est levé et utilisé de cette façon. (À l'intérieur d'une classe wrapper est créé dans le cas où les variables qui sont utilisées dans l'expression lambda devenir des champs.)

Maintenant, nous allons voir ce qu' model => item.FirstName moyens. Logiquement, il serait traduit en string Function(Model model) { return item.FirstName; }. Fondamentalement, c'est une fonction avec un paramètre, mais ce paramètre n'est pas utilisé.

Et maintenant, le dernier morceau de l'information. Bien que les expressions lambda représenter les fonctions à la fin, parfois, ils sont créés non pas dans le but d'être réellement exécutées (bien que potentiellement ils le peuvent). Une expression lambda peut être représenté sous la forme d'une arborescence d'expression. Cela signifie qu'au lieu de l'exécuter, il peut être analysée.

Dans ce cas particulier MVC moteur de ne pas exécuter la fonction que le lamba expression représente. Au lieu de cela, l'expression est analysée afin que MVC moteur sait ce que le html à émettre pour cette ligne en particulier. Si votre élément de données ne proviennent pas de votre modèle d'objet directement, la partie gauche de l'expression lambda n'a pas d'importance.

7voto

varg Points 818

je pense qu'il s'agit de la boucle foreach. Exemple:

 @foreach(var item in model) 
{ 
 <td> 
     @html.displayfor(model => item.firstName) </td>
 </td>     
}
 

var item doit être utilisé car chaque élément de la séquence est de type anonyme. model => item.firstName signifie (input parameter) => expression . vous ne pouvez pas utiliser le paramètre d'entrée car nous stockons l '"élément" actuel dans item .

5voto

GraemeMiller Points 4299

Il utilise une lambada sans paramètre. Voir cette question

Fondamentalement, DisplayFor n'utilise pas le modèle de paramètre de la fonction lambda (cela pourrait être tout ce que je dirais utiliser _ ou ()) et utilise simplement la fonction lambda dans la boucle for pour utiliser displayfor contre. DisplayFor nécessite une fonction lambda.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X