2010-07-23 24 views
5

El MSDN magazine article by Josh Smith on MVVM contiene una expresión lambda que no entiendo completamente. ¿Cuál es el propósito de param en este código?¿Por qué es param en esta expresión lambda?

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

Traducido a mi idioma preferido VB es:

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

lo que habría esperado sólo para ver parámetro si se utiliza dentro de CanSave o Guardar. Soy algo nuevo para las expresiones lambda. Es extraño para mí ver una variable que ni se declara ni se usa en ningún lado hasta donde yo sé. Cualquier explicación sería apreciada.

Para poner esto en contexto, el constructor para RelayCommand (C#) es:

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

y en VB:

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

Respuesta

3

La expresión lambda es declarando que - el lugar donde aparece es básicamente una declaración. Si no fuera así, no sería compatible con Action(Of Object). Es por eso que está ahí, a pesar de que en realidad no necesitas el valor.

Con los métodos anónimos, si es que no es necesario ningún valores de los parámetros se puede omitir por completo la lista de parámetros:

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

... pero no se puede hacer eso con las expresiones lambda. Usted tiene para especificar la lista de parámetros, ya sea como un nombre de parámetro para un solo parámetro o como una lista completa entre paréntesis. El código que ha presentado es equivalente a:

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

Creo que lo entiendo ahora. Pero, ¿por qué se ejecuta execute como Action (Of Object) cuando se ignora Object? ¿Es porque RelayCommand implementa ICommand.Execute (que toma un parámetro de objeto)? Cosas confusas. ¡Extraño VB6! – DeveloperDan

+0

@DeveloperDan: 'RelayCommand' en sí no sabe si va a ignorar el parámetro o no. Le dará * el valor relevante, da la casualidad de que estos delegados lo ignorarán. Piense que es como un controlador de eventos: no todos los controladores de eventos se molestan en usar 'sender' o' args', ¿verdad? Simplemente los ignoran alegremente, y todo está bien. Es exactamente lo mismo aquí. –

+0

Gracias Jon. Usted ha explicado esto bien. Y veo que eres bastante prolífico. Tengo la intención de aprender mucho más de tus otras publicaciones, webcasts y podcasts. – DeveloperDan

Cuestiones relacionadas