Trong trường hợp cụ thể này của các lệnh ràng buộc, nó không thực sự quan trọng.
Trong các trường hợp khác, tức là có một lớp nhận dịch vụ được tiêm qua hàm tạo và bạn muốn hiển thị nó (vì bất kỳ lý do gì), điều quan trọng là sử dụng thuộc tính chỉ đọc.
Ví dụ:
public class MainViewModel
{
public INavigationService NavigationService { get; }
public MainViewModel(INavigationService navigationService)
{
if(navigationService == null)
throw new ArgumentNullException(navigationServie);
NavigationService = navigationService;
}
}
Khi sử dụng này, bạn đảm bảo lớp này bất biến và nó được đảm bảo rằng NavigationService
sẽ không bao giờ null
, do đó bạn không cần phải làm kiểm tra rỗng chống NavigationService
trước khi sử dụng nó. Một khi nó rời khỏi hàm tạo, nó không bao giờ có thể được thay đổi (tốt, ngoại trừ thông qua sự phản chiếu).
Ở phía bên kia nếu bạn có
public class MainViewModel
{
public INavigationService NavigationService { get; private set; }
public MainViewModel(INavigationService navigationService)
{
if(navigationService == null)
throw new ArgumentNullException(navigationServie);
NavigationService = navigationService;
}
}
sau đó nó có thể viết mã (do nhầm lẫn hoặc bởi một nhà phát triển chưa từng trải) mà hiện NavigationService = null
và sau đó nếu bạn không có null-kiểm tra và truy cập nó , bạn sẽ nhận được NullReferenceException
và nếu không xử lý sự cố ứng dụng của bạn.
Quay lại ví dụ: Trong trường hợp ICommand
... bạn thường không truy cập Lệnh trong ViewModel, chỉ gán lệnh đó (thường là trong hàm tạo hoặc khi nội dung của mô hình chế độ xem thay đổi, như chế độ xem con đã thay đổi và bạn muốn gán lệnh của nó cho thuộc tính lệnh viewmodel cha mẹ).
Trong trường hợp của một danh sách:
Nếu bạn không bao giờ làm Screenshots = new List<ScreenShot>()
hoặc Screenshots = DisplayScreenshots()
trong mã của bạn và chỉ khởi tạo nó trong các nhà xây dựng, sau đó nó thực sự tốt hơn để làm cho nó chỉ đọc với cùng lý do: Sau đó, bạn có thể đảm bảo rằng Screenshots
không bao giờ là vô bạn sẽ không cần phải viết mã như
if(Screenshots != null)
{
Screenshots.Add(new Screenshot(...));
}
hoặc
if(Screenshot == null)
{
Screenshots = new List<Screenshot>();
}
Screenshots.Add(new Screenshot(...));
một lần nữa và thay vào đó luôn luôn sử dụng
Screenshots.Add(new Screenshot(...));
này có một lợi thế rất lớn mà bạn cần ít mã, mã của bạn là dễ đọc hơn và dễ bảo trì hơn, vì bạn không thể "quên" một null-kiểm tra và có nguy cơ một NullReferenceException
.
Hy vọng đã xóa nó.
Thuộc tính chỉ có giống như các trường 'readonly', chúng có thể được thiết lập trong việc xây dựng/khởi tạo đối tượng nhưng không phải sau này. Thiết lập riêng tư không đảm bảo rằng các phương thức khác không thể sửa đổi giá trị của nó sau khi xây dựng. –
Tính năng "mới" trong thuộc tính đầu tiên của bạn ('AddCommand') là gì? – Amit
@Amit: Bộ truy cập 'set' bị thiếu. – SeToY