Отличается ли возвращаемый List <T>от метода по производительности от возвращаемого Collection <T>? - PullRequest
1 голос
/ 19 июля 2010

У нас есть веб-проект, который содержит свои бизнес-методы в проекте библиотеки классов под названием "Bll.dll"
некоторые методы Bll.dll возвращают List <> ...
из источника - что я и не наденуне помню сейчас - сказал, что возвращать Collection <> лучше, чем возвращать List <>
Это допустимо?
Обратите внимание, что я не делаю никакой обработки для значений, возвращаемых из методов BLL.. просто просмотреть его на веб-странице

Ответы [ 5 ]

4 голосов
/ 19 июля 2010

Collection<T> реализован, IIRC, как оболочка вокруг IList<T>, из которых реализация по умолчанию - List<T>. Следовательно, у Collection<T> есть по крайней мере еще одна абстракция, чем у List<T>, но в целом это не будет узким местом. На самом деле, вы можете рассмотреть возможность возврата IList<T>.

Редактировать: вот конструктор Collection<T>, предоставлено отражателем:

public Collection()
{
    this.items = new List<T>();
}

так что действительно, это оборачивает слой абстракции. Плюс плюс в том, что вы можете добавить свою собственную валидацию и т. Д. Путем подкласса Collection<T> (что невозможно при использовании List<T> напрямую или с помощью подклассов, поскольку нет интересных virtual методов) .

Еще одна вещь, которую следует учитывать, это то, что они будут иметь одинаковую общую производительность в терминах «O» (при условии, что вы используете реализацию List<T> по умолчанию). Индексный поиск будет O(1) и т. Д.

2 голосов
/ 19 июля 2010

Вы действительно должны возвращать только интерфейс, который соответствует целям, которые вы установили при разработке вашего API.Например, если вы ожидаете, что ваши клиенты будут выполнять итерацию по коллекции, верните IEnumerable<T>.Что касается вашего конкретного вопроса, я чувствую, что ICollection<T> отчасти бесполезен, поскольку в нем отсутствует индексатор.

0 голосов
/ 19 июля 2010

Лучшее, что можно сделать, это предоставить строго типизированный класс, такой как CustomerCollection.Таким образом, у вас есть место для добавления свойств и методов позже.

Официально вы не должны раскрывать список, но я лично не вижу проблем с ним.

0 голосов
/ 19 июля 2010

Проблема с возвратом списка заключается в том, что вызывающий может изменить его. Если вы когда-нибудь захотите подключить какой-либо механизм уведомления («Уведомлять вызываемого, когда вызывающий добавляет новый объект к нему»), вы не можете сделать это, поскольку List является тупиком.

Возврат коллекции / ICollection позволяет вам создать собственную реализацию, которая имеет все, что вы хотите.

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

Так что Коллекция / ICollection / IList предпочтительнее.

Пожалуйста, посмотрите этот вопрос и эту статью .

0 голосов
/ 19 июля 2010

Это лучше может не относиться к исполнению, а только к типу возвращаемого типа.

В этом случае нелегко сказать, что лучше, на мой взгляд, зависимость от использования метода "localy" лучше для возврата типа, с которым мы работаем.

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