Я думаю об этом с точки зрения написания самого полезного из возможных кодов: кода, который может сделать больше.
В этих терминах это означает, что мне нравится принимать самый слабый интерфейс, возможный в качестве аргументов метода, потому что это делает мой код полезным из большего количества мест. В данном случае это IEnumerable<T>
. Есть массив? Вы можете вызвать мой метод. Есть список? Вы можете вызвать мой метод. Есть блок итератора? Вы поняли.
Это также означает, что мне нравятся мои методы для возврата самого сильного интерфейса, который удобен, так что код, основанный на методе, может легко сделать больше. В этом случае это будет IList<T>
. Обратите внимание, что это не значит, что я создам список только для того, чтобы я мог его вернуть. Это просто означает, что если у меня уже есть некоторый, который реализует IList<T>
, я могу также использовать его.
Обратите внимание, что я немного необычен в отношении типов возвращаемых данных. Более типичный подход - также возвращать более слабые типы из методов, чтобы избежать привязки к конкретной реализации.