Почему его лучше (вернуть 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, вызывающий может помещать его в экземпляр всего, что реализует этот интерфейс. Предположим, что вызывающий выполнил реализацию, которая поддерживает какую-то фанк-сортировку, или, возможно, они внедрили реализацию, которая непосредственно отображает список в таблицу базы данных.

Это о свободе для получателя для реализации списков.