2010-07-23 30 views
5

Các MSDN magazine article by Josh Smith on MVVM chứa một biểu thức lambda tôi không hoàn toàn hiểu. Mục đích của param trong mã này là gì?Tại sao param trong biểu thức lambda này?

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

Dịch sang các ngôn ngữ ưa thích của tôi VB đó là:

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

tôi sẽ dự kiến ​​sẽ chỉ nhìn thấy param nếu được sử dụng trong vòng CanSave hoặc Save. Tôi hơi mới với các biểu thức lambda. Thật kỳ lạ khi tôi thấy một biến không được khai báo và cũng không được sử dụng ở bất kỳ nơi nào mà tôi có thể nói. Mọi lời giải thích sẽ được đánh giá cao.

Để đặt điều này trong bối cảnh các nhà xây dựng cho RelayCommand (C#) là:

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

và trong VB:

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

Trả lời

3

Lambda biểu tuyên bố nó - nơi mà nó xuất hiện về cơ bản là một tuyên bố. Nếu không, nó sẽ không tương thích với Action(Of Object). Đó là lý do tại sao nó ở đó - mặc dù bạn không thực sự cần giá trị.

Với phương pháp vô danh, nếu bạn không cần bất kỳ giá trị tham số bạn có thể bỏ qua các tham số danh sách hoàn toàn:

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

... nhưng bạn không thể làm điều đó với các biểu thức lambda. Bạn để chỉ định danh sách tham số - hoặc chỉ là tên thông số cho một tham số hoặc danh sách đầy đủ trong dấu ngoặc đơn. Mã bạn đã trình bày tương đương với:

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

Tôi nghĩ mình đã hiểu ngay bây giờ. Nhưng tại sao thực hiện khai báo là Action (Of Object) khi Object bị bỏ qua? Có phải vì RelayCommand Implements ICommand.Execute (có tham số đối tượng) không? Công cụ gây nhầm lẫn - Tôi nhớ VB6! – DeveloperDan

+0

@DeveloperDan: 'RelayCommand' không biết bạn có bỏ qua tham số hay không. Nó sẽ * cho * bạn giá trị có liên quan - nó chỉ xảy ra khi các đại biểu này sẽ bỏ qua nó. Hãy nghĩ nó giống như một trình xử lý sự kiện - không phải mọi trình xử lý sự kiện đều sử dụng 'người gửi' hoặc' args', phải không? Họ chỉ vui vẻ bỏ qua chúng, và tất cả đều tốt. Nó hoàn toàn giống nhau ở đây. –

+0

Cảm ơn Jon. Bạn đã giải thích rõ điều này. Và tôi thấy bạn khá sung mãn. Tôi có ý định tìm hiểu nhiều hơn từ các bài đăng khác của bạn, webcast và podcast. – DeveloperDan

Các vấn đề liên quan