2010-07-23 2 views
5

Le MSDN magazine article by Josh Smith on MVVM contient une expression lambda que je ne comprends pas complètement. Quel est le but de param dans ce code?Pourquoi param dans cette expression lambda?

_saveCommand = new RelayCommand(param => this.Save(), 
       param => this.CanSave); 

traduit dans ma langue préférée VB il est:

Dim saveAction as New Action(Of Object)(AddressOf Me.Save) 
_saveCommand = New RelayCommand(saveAction, Function(param) Me.CanSave) 

Je me serais attendu à voir que si elle param est utilisé dans CANSAVE ou Enregistrer. Je suis un peu nouveau pour les expressions lambda. C'est bizarre pour moi de voir une variable qui n'est ni déclarée ni utilisée nulle part autant que je sache. Toute explication serait appréciée.

Pour mettre cela en contexte, le constructeur de RelayCommand (C#) est:

public RelayCommand(Action<object> execute, Predicate<object> canExecute) 

et VB:

Public Sub New(ByVal execute As Action(Of Object), _ 
       ByVal canExecute As Predicate(Of Object)) 

Répondre

3

L'expression lambda est déclarant - l'endroit où il apparaît est essentiellement une déclaration. Si ce n'était pas le cas, cela ne serait pas compatible avec Action(Of Object). C'est pourquoi c'est là - même si vous n'avez pas vraiment besoin de la valeur.

Avec des méthodes anonymes, si vous ne avez pas besoin de valeurs de paramètres que vous pouvez omettre la liste des paramètres entièrement:

_saveCommand = new RelayCommand(delegate { this.Save(); }, 
    delegate { return this.CanSave; }); 

... mais vous ne pouvez pas le faire avec des expressions lambda. Vous avez pour spécifier la liste de paramètres - soit juste comme un nom de paramètre pour un seul paramètre, ou une liste complète entre parenthèses. Le code que vous avez présenté est équivalent à:

_saveCommand = new RelayCommand((Object param) => this.Save(), 
    (Object param) => this.CanSave); 
+0

Je crois que je comprends maintenant. Mais pourquoi l'exécution est-elle déclarée comme Action (Of Object) quand Object est ignoré? Est-ce parce que RelayCommand implémente ICommand.Execute (qui prend un paramètre d'objet)? Des trucs qui déroutent - VB6 me manque! – DeveloperDan

+0

@DeveloperDan: 'RelayCommand' lui-même ne sait pas si vous allez ou non ignorer le paramètre. Cela vous donnera la valeur pertinente - il se trouve que ces délégués vont l'ignorer. Pensez-y comme étant un gestionnaire d'événement - ce n'est pas tous les gestionnaires d'événements qui utilisent 'sender' ou' args', n'est-ce pas? Ils les ignorent joyeusement, et tout va bien. C'est exactement pareil ici. –

+0

Merci Jon. Vous avez bien expliqué cela. Et je vois que vous êtes assez prolifique. J'ai l'intention d'en apprendre beaucoup plus sur vos autres posts, webcasts et podcasts. – DeveloperDan

Questions connexes