Почему его лучше (вернуть IList вместо списка возврата)?
Возможный дубликат:
С# - Список <T> или IList <T>
Когда я возвращаю список из своего метода, я могу сделать это двумя способами.
Как список
Private List<datatype> MethodName()
{
Return List
}
Как IList
Private IList<datatype> MethodName()
{
Return IList
}
Как я слышал, мы должны вернуть его как IList. Кто-нибудь может объяснить, что это?
Ответы
Ответ 1
Если вы публикуете свой класс через библиотеку, которую будут использовать другие, вы обычно хотите разоблачить его через интерфейсы, а не конкретные Реализации. Это поможет, если вы решите изменить позже реализовать свой класс, чтобы использовать другой конкретный класс. В этом случае пользователям вашей библиотеки не потребуется обновлять свой код так как интерфейс не изменяется.
Если вы просто используете его внутренне, вам может не все равно, и использование List может быть в порядке.
Прочтите решение этого вопроса: Почему не рекомендуется выводить список <T> ?
Ответ 2
Отделяет интерфейс от реализации. Для вызывающего не важно, как вы реализуете объект результата, поэтому использование интерфейсов уменьшает сцепление. Если вы вернетесь IList
, вы можете переключиться на другую реализацию в любое время, не нарушая код вызывающего абонента.
Ответ 3
Вы не можете вернуть IList
- вам нужно вернуть реализацию этого интерфейса (т.е. a List
). Конечно, возврат "List" будет удовлетворять вашему объявлению метода возврата IList
, потому что List
реализует IList
.
В целом наилучшей практикой является прием параметров самого общего типа и возврат наиболее специфических. Однако обычно программисты не хотят привязываться к реализации List
и обычно возвращают интерфейс IList
. Вы можете вернуть IEnumerable
, если вы не хотите, чтобы вызывающие абоненты модифицировали массив (вызывают метод расширения .AsReadOnly()
на вашем IList
).
Ответ 4
Возврат интерфейса позволяет вам позже изменить свою реализацию и тем самым уменьшить сцепление.
Однако при возврате объекта это обычно мало практично. Это гораздо более актуально при принятии объектов (например, в качестве параметра функции).
Ответ 5
Если вы вернетесь как только List. то вызывающая функция вашей функции должна поместить возврат в экземпляр класса List.
Когда вы возвращаете IList, вызывающий может помещать его в экземпляр всего, что реализует этот интерфейс. Предположим, что вызывающий выполнил реализацию, которая поддерживает какую-то фанк-сортировку, или, возможно, они внедрили реализацию, которая непосредственно отображает список в таблицу базы данных.
Это о свободе для получателя для реализации списков.