Коллекция против ICollection - PullRequest
0 голосов
/ 21 октября 2010

Я создал фиктивный проект для тестирования коллекции и ICollection. У меня есть пользовательский класс, и я хотел создать коллекцию. Пример -

ICollection<User> users = new Collection<User>();
Collection<User> users = new Collection<User>();

Оба кода работают нормально, независимо от того, использую я коллекцию или коллекцию. Теперь кто-нибудь может сказать мне, в чем разница между двумя линиями выше?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

Первая строка ICollection<User> users = new Collection<User>(); создает ссылку на объект (Collection), который реализует интерфейс ICollection, тогда как вторая строка Collection<User> users = new Collection<User>(); создает ссылку на объект, который является конкретной реализацией класса Collection, где T = User.

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

Использование Collection в качестве ссылки тесно связывает ваш код обработки с классом Collection, конкретной реализацией ICollection, и хотя вы все еще можете использовать только методы, определенные в интерфейсе, вы можете также использовать некоторые специфические функции класса, и тогда вы выиграете не сможет легко заменить объект коллекции чем-то другим. Для этого есть веские причины, но это немного выходит за рамки ответа здесь, поищите здесь «Внедрение зависимостей» и «Инверсия управления», и я уверен, что вы найдете множество фоновой информации.

2 голосов
/ 21 октября 2010

Collection<T> - это просто реализация ICollection<T>.Если кто-то создает другой класс, который реализует из ICollection<T>, вы можете легко использовать его, заменив первую строку на:

ICollection<User> users = new MyCustomCollectionCollection<User>();

Позже в коде вам не нужно ничего исправлять, так кактот же интерфейс все еще используется.

2 голосов
/ 21 октября 2010

ICollection - это интерфейс. Коллекция реализует ICollection, поэтому она работает. ICollection не является классом, так что это не сработает:

ICollection<User> users = new ICollection<User>();

.. потому что вы не можете создать экземпляр интерфейса. Интерфейс просто описывает то, что класс должен реализовать.

0 голосов
/ 21 октября 2010

потому что users является ссылкой. в обоих примерах он указывает на один и тот же объект. поведение определяется классом объекта и оно одно и то же.

...