2010-09-22 35 views
12

Khi sử dụng, hầu hết các ví dụ tôi đã nhìn thấy sử dụng khởi tạo lười biếng Josh Smith RelayCommand như:Tại sao RelayCommands thường sử dụng khởi tạo lười biếng?

public class ViewModel 
{ 
    private ICommand myCommand; 

    public ICommand MyCommand 
    { 
     get 
     { 
      if (myCommand == null) 
      { 
       myCommand = new RelayCommand(p => DoSomething()); 
      } 

      return myCommand; 
     } 
    } 
    // ... stuff ... 

} 

Thay vì tạo ra RelayCommand trong các nhà xây dựng, như thế này:

public class ViewModel 
{ 
    public ViewModel() 
    { 
      MyCommand = new RelayCommand(p => DoSomething()); 
    } 

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

gì là lợi ích của việc sử dụng khởi tạo lười biếng ở đây? Nó sẽ phải gọi thuộc tính get khi thiết lập các ràng buộc, vì vậy tôi không thể thấy một lý do để sử dụng phương thức này trên các thiết lập mọi thứ trong constructor.

Tôi có thiếu gì đó ở đây không?

+0

Bạn nói đúng. Việc khởi tạo Lazy RoutedCommands không có ý nghĩa gì vì chúng rất nhẹ và chúng được nạp ngay khi View gắn với nó. – jbe

Trả lời

15

Trên thực tế, WPF và Silverlight sẽ nhận được lệnh tiếp sức chỉ một lần mỗi ràng buộc, do đó bạn không thực sự cần phải lưu trữ một lĩnh vực sao lưu ở tất cả:

public ICommand MyCommand 
{ 
    get 
    { 
     return new RelayCommand(p => DoSomething()); 
    } 
} 

Vì vậy, trong khi không có gì sai với việc tạo ra nó trong các .ctor như bạn đề nghị, có rất ít lý do để.

+2

_ "WPF và Silverlight sẽ nhận lệnh chuyển tiếp chỉ một lần cho mỗi liên kết" _ - Tôi biết trong thực tế điều này là đúng sự thật. Nhưng, do tài liệu không _promise_ hành vi này, có thực sự là tất cả những điều khôn ngoan để tạo ra một đối tượng mới mỗi khi giá trị thuộc tính được lấy ra? Điều gì xảy ra vào ngày hôm đó mà Microsoft, vì lý do gì đó, quyết định để cho đối tượng mô hình của bạn giữ tham chiếu đối tượng lệnh thay vì lưu vào bộ nhớ đệm ở đâu đó, và chúng chỉ nhận giá trị từ thuộc tính mỗi khi cần? –

+2

@Peter Duniho: Không chỉ Microsoft; mô hình khung nhìn của tôi gọi các lệnh của nó (và CanExecute()) trực tiếp từ các phương thức riêng của nó mọi lúc. Vì vậy, không, nó sẽ là không khôn ngoan để tạo ra một trường hợp mới mỗi lần. – BoltClock

+0

@BoltClock: điểm tốt. Tôi sẽ rõ ràng hơn về các kịch bản trong [bài đăng khác] (https://stackoverflow.com/a/46420039) –

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