Почему param в этом лямбда-выражении? - PullRequest
5 голосов
/ 23 июля 2010

Статья Джоша Смита в журнале MSDN о MVVM содержит лямбда-выражение, которое я не совсем понимаю. Какова цель 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)

Я бы ожидал увидеть param , только если он используется в CanSave или Save. Я немного новичок в лямбда-выражениях. Насколько я могу судить, странно видеть переменную, которая нигде не объявлена ​​и не используется нигде. Любое объяснение будет оценено.

Чтобы поместить это в контекст, конструктор для 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))

1 Ответ

3 голосов
/ 23 июля 2010

Лямбда-выражение - это , декларирующее его - место, где оно появляется, по сути является объявлением. Если этого не произойдет, он не будет совместим с Action(Of Object). Вот почему он есть - даже если вам на самом деле не нужно значение.

При использовании анонимных методов, если вам не нужны никакие значения параметров, вы можете полностью пропустить список параметров:

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

... но вы не можете сделать это с помощью лямбда-выражений. У вас есть для указания списка параметров - либо просто как имя параметра для отдельного параметра, либо как полный список в скобках. Код, который вы представили, эквивалентен:

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