5

Josh Smith 关于 MVVM的MSDN 杂志文章包含一个我不完全理解的 lambda 表达式。这段代码中param的目的是什么?

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

翻译成我的首选语言 VB 它是:

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

如果在 CanSave 或 Save 中使用它,我本来希望只看到param 。我对 lambda 表达式有点陌生。据我所知,看到一个既没有声明也没有在任何地方使用的变量对我来说很奇怪。任何解释将不胜感激。

为了把它放在上下文中,RelayCommand (C#) 的构造函数是:

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

在 VB 中:

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

1 回答 1

3

lambda 表达式正在声明它——它出现的地方基本上是一个声明。如果没有,它将不兼容Action(Of Object). 这就是它存在的原因——即使您实际上并不需要该值。

使用匿名方法,如果您不需要任何参数值,您可以完全省略参数列表:

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

...但你不能用 lambda 表达式来做到这一点。您必须指定参数列表 - 既可以作为单个参数的参数名称,也可以作为括号中的完整列表。您提供的代码相当于:

_saveCommand = new RelayCommand((Object param) => this.Save(),
     (Object param) => this.CanSave);
于 2010-07-23T12:50:18.923 回答