Выставление коллекции через интерфейс - PullRequest
0 голосов
/ 26 октября 2009

Я новичок в C #. Я хочу знать различия в использовании коллекций. Я подозреваю, что следующий вопрос может быть задан ранее (если так любезно, покажите мне ссылку).

В чем разница между

IList<int> intCollection = new List<int>();

и

List<int> intCollection = new List<int>();
  1. Почему я должен выставлять свою коллекцию через интерфейс.
  2. Это просто синтетический сахар для выбора первого подхода?
  3. С какими недостатками я столкнусь, если предположу использовать более поздний подход?
  4. Если соответствующий интерфейс завершается, следует косвенно инициализировать весь класс коллекции используя соответствующий интерфейс?
  5. Пожалуйста, покажите мне преимущества в примере демонстрации коллекции через интерфейс.

Ответы [ 2 ]

5 голосов
/ 26 октября 2009

Использование интерфейса позволяет изменить реализацию поддержки без прерывания вызовов.

Две строки в вашем примере означают одно и то же, но если вы выставите IList<T> как свойство, вы можете точно изменить то, что возвращается, без вызова кода, который нужно изменить.

Предположим, у вас есть класс, который выставляет List<int> как свойство. Все в порядке, до тех пор, пока вы не поймете, что вам нужно обработать событие, возникающее при добавлении элемента в этот список. Вы не можете; вам придется изменить тип свойства и, следовательно, весь код, который вызывает это. Если вы изначально объявите IList<int>, вы можете изменить конкретную реализацию на другую (если она все еще поддерживает интерфейс).

Это то, что StyleCop подняло и рассмотрело в этот вопрос .

2 голосов
/ 26 октября 2009

Преимущества использования интерфейса в том, что он дает вам гибкость для будущих изменений. В вашем примере использование IList позволит вам в будущем использовать другую реализацию IList, и вам нужно будет только изменить инициализатор объекта.

В другом сценарии у вас есть код, который может потребоваться для взаимодействия со многими различными типами одного и того же интерфейса, или реализация полностью неизвестна. Например, шаблон стратегии, в котором вам нужно использовать разные алгоритмы сортировки и вы хотите использовать разные реализации IList в зависимости от ваших потребностей в сортировке. Или вы, возможно, используете модель плагина и не знаете, какой тип списка будет добавлен другим компонентом в ваш API, но все, что вас волнует, это то, что это ILIST, который выполняет контракт IList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...