Почему неявное повышение при объявлении? - PullRequest
3 голосов
/ 16 июня 2020

Зачем мне неявно повышать при объявлении? Мой вопрос возникает из следующего кода из моего учебника.

private readonly IList<Inventory> _cars = new ObservableCollection<Inventory>();

Почему бы мне просто не сделать это вместо этого.

private readonly ObservableCollection<Inventory> _cars = new ObservableCollection<Inventory>();

Если я просто экономлю место, почему бы и нет просто сделай это вместо этого?

private readonly var _cars = new ObservableCollection<Inventory>();

Спасибо,

Ответы [ 2 ]

4 голосов
/ 16 июня 2020

Речь идет не об экономии нажатий клавиш; это о принципе «наименьших привилегий» .

Это:

private readonly var _cars = new ObservableCollection<Inventory>();

И это:

private readonly ObservableCollection<Inventory> _cars = new ObservableCollection<Inventory>();

Сделайте заявление явно что _cars наблюдаемо. Код, который вы напишете позже, может закончиться в зависимости от этого, даже если это не был ваш оригинальный дизайн. В общем, вы хотите использовать самый простой интерфейс, который выполняет эту работу, поэтому, если есть какая-то часть вашего кода, которой не нужно знать, что что-то наблюдается, рекомендуется статически вводить ваши переменные, чтобы они использовали ненаблюдаемый интерфейс.

Когда вы пишете:

private readonly IList<Inventory> _cars = new ObservableCollection<Inventory>();

, вы даете понять, что не хотите писать код, зависящий от наблюдаемости _cars, и компилятор выдаст ошибку и кричать на вас, если вы это сделаете, и это хорошо.

1 голос
/ 16 июня 2020

В дополнение к последнему принципу привилегий, есть еще 2 причины для этого:

  1. Использование OOP через базовый класс. Примеры включают хранение треугольников и кругов в списке фигур (classi c пример колледжа) и фабрик (которые могут возвращать любое количество конкретных реализаций через ссылку).

  2. Получение доступа к. Net бокс фейковые интерфейсы. Например, IConvertible convertible = 5; - int не имеет интерфейсов, на самом деле никакого типа значения не имеет, но когда он упакован (приведен к object), фреймворк позволяет вам получить к ним доступ, как если бы они реализовали кучу интерфейсов .

...