Ответ 1
В этом конкретном случае команд привязки это не имеет большого значения.
В других случаях, то есть с классом, который получает услугу, введенную через конструктор, и вы хотите ее открыть (по какой-либо причине), важно использовать свойства только для чтения.
Например:
public class MainViewModel
{
public INavigationService NavigationService { get; }
public MainViewModel(INavigationService navigationService)
{
if(navigationService == null)
throw new ArgumentNullException(navigationServie);
NavigationService = navigationService;
}
}
При использовании этого вы гарантируете этот инвариант класса, и он гарантирует, что NavigationService
никогда не будет null
, поэтому вам не нужно делать нулевые проверки против NavigationService
перед его использованием. Как только он покидает конструктор, он никогда не может быть изменен (ну, кроме как через отражение).
С другой стороны, если у вас
public class MainViewModel
{
public INavigationService NavigationService { get; private set; }
public MainViewModel(INavigationService navigationService)
{
if(navigationService == null)
throw new ArgumentNullException(navigationServie);
NavigationService = navigationService;
}
}
тогда можно написать код (по ошибке или неопытным разработчиком), который делает NavigationService = null
, а затем, если у вас нет нулевой проверки и доступа к ней, вы получите NullReferenceException
, а если не обработать сбой приложений.
Возвращаясь к вашему примеру: В случае ICommand
... вы обычно не получаете доступа к Commands в вашей ViewModel, назначаете его только (обычно в конструкторе или при изменении содержимого модели вашего представления, например, при изменении модели просмотра для детей и вы хотите назначить его команде для свойства родительской модели viewmodel).
В случае списка:
Если вы никогда не делаете Screenshots = new List<ScreenShot>()
или Screenshots = DisplayScreenshots()
в своем коде и только инициализируете его в конструкторе, то действительно лучше сделать его прочитанным только по той же причине: тогда вы можете гарантировать, что Screenshots
никогда не является нулевым и вам не придется писать код, например
if(Screenshots != null)
{
Screenshots.Add(new Screenshot(...));
}
или
if(Screenshot == null)
{
Screenshots = new List<Screenshot>();
}
Screenshots.Add(new Screenshot(...));
и вместо этого всегда используйте
Screenshots.Add(new Screenshot(...));
Это имеет огромное преимущество в том, что вам нужно меньше кода, ваш код более читабельный и более ремонтопригодный, поскольку вы не можете "забыть" проверку нулевого уровня и риск NullReferenceException
.
Надеюсь, что это прояснилось.