2012-06-19 18 views
9

Có đáng để viết đoạn mã này:Có tệ khi trả lại ICommand mới mỗi lần trong tài sản getter?

RelayCommand _saveCommand; 
public ICommand SaveCommand 
{ 
    get 
    { 
     if (_saveCommand == null) 
     { 
      _saveCommand = new RelayCommand(this.Save); 
     } 
     return _saveCommand; 
    } 
} 

thay vì chỉ trở về đối tượng mới mỗi lần:

public ICommand SaveCommand 
{ 
    get { return new RelayCommand(this.Save); } 
} 

Từ những gì tôi biết lệnh thu khí được sử dụng khá hiếm và RelayCommand 's constructor khá nhanh. Tốt hơn là viết mã dài hơn?

+2

nó là gì bạn đang quan tâm? Mã độ dài, sử dụng bộ nhớ, ..? Nếu chiều dài của nó dài, bạn có thể rút ngắn ví dụ đầu tiên xuống một dòng: 'return _saveCommand ?? (_saveCommand = new RelayCommand (this.Save)); ' – Brunner

+0

Tại sao bạn không làm' readonly RelayCommand _saveCommand = new RelayCommand (Save); công khai ICommand SaveCommand {get {return _saveCommand; }} '? –

+0

Hoặc bạn cũng có thể thêm '_saveCommand = new RelayCommand (Lưu);' trong ctor của lớp học của bạn –

Trả lời

10

Tôi thích null coalescing operator

public ICommand SaveCommand 
{ 
    get { return _saveCommand ?? (_saveCommand = new RelayCommand(this.Save); } 
} 

Nó trả về toán hạng bên trái nếu toán hạng không phải là null, nếu không nó sẽ trả về toán hạng phải.

+0

Trong khi tôi thích '??', tôi cảm thấy nó không phải là câu trả lời cho câu hỏi đã được hỏi. Mà tôi nghĩ rằng boils xuống để "trả lại đối tượng mới mỗi lần hoặc tái sử dụng cũ". – Brunner

+0

@Brunner: Vâng, tôi đồng ý. Nhưng câu hỏi cũng có chứa "Viết mã dài hơn" và '??' làm cho nó ngắn hơn rất nhiều. Dù sao, tôi sắp sửa sửa câu hỏi để đưa thêm thông tin nhưng sau đó các câu trả lời khác đã được đăng. –

6

Thiết kế này có thể gây nhầm lẫn cho người dùng lớp học của bạn. Ví dụ, họ có thể đọc giá trị của thuộc tính trong một vòng lặp với hàng ngàn lần lặp. Điều đó sẽ tạo ra nhiều đối tượng mới và người dùng có thể sẽ không mong đợi điều đó.

Xem tài liệu về cảnh báo StyleCop CA1819: Properties should not return arrays - đây là sự cố rất giống nhau.

Thông thường, người dùng sẽ không hiểu tác động bất lợi của việc gọi điện cho một thuộc tính như vậy. Cụ thể, họ có thể sử dụng thuộc tính làm thuộc tính được lập chỉ mục.

Ngoài ra, SaveCommand == SaveCommand sẽ là sai. Tôi nghĩ điều này phản trực giác.

Tóm lại, đây có thể không phải là thiết kế tốt nhất, tuy nhiên, nếu người dùng mã của bạn biết cách hoạt động và cách sử dụng đúng cách, thì không sao.

1

Có, thật tệ khi trả lại đối tượng mới mỗi lần. Tại sao làm điều đó? Nếu, vì lý do nào đó, getter đó được gọi nhiều lần, bạn sẽ tạo ra các đối tượng mới trong bộ nhớ mỗi lần. Nếu bạn làm điều đó cho người này, một cá thể bị cô lập, điều đó không quá khủng khiếp. Nhưng nếu bạn tạo thói quen lập trình theo cách này, bạn sẽ tạo ra các vấn đề khó tìm và có cơ sở mã khó duy trì. Tốt hơn là đơn giản, sạch sẽ và thanh lịch mọi lúc, và kết thúc với một cơ sở mã đẹp, sạch sẽ, dễ bảo trì.

Bằng cách này, bạn có thể luôn luôn chỉ cần khởi tạo lĩnh vực này khi bạn khai báo nó:

RelayCommand _saveCommand = new RelayCommand(this.Save); 

Sau đó getter của bạn chỉ cần này trong đó:

return _saveCommand; 
Các vấn đề liên quan