Контекст: я отправил электронное письмо своим коллегам, в котором рассказывал им о Enumerable.Empty<T>()
как о возврате пустых коллекций, не делая что-то вроде return new List<T>();
. Я получил ответ, говорящий, что недостатком является то, что он не выдает определенный тип
Это представляет собой крошечную проблему. Всегда полезно быть как можно более конкретным относительно вашего типа возврата * (поэтому, если вы возвращаете List < > , введите этот тип возврата); потому что такие вещи, как "Списки" и "Массивы", имеют дополнительные методы, которые полезны. Кроме того, это может быть полезно при определении производительности при использовании коллекции из вызывающего метода.
Трюк ниже, к сожалению, заставляет вас возвращать IEnumerable, который примерно как нельзя более конкретный, не так ли?: (
* Это на самом деле из .NET Design Guidelines. Полагаемые причины в руководящих принципах те же, что и я упоминаю здесь, я считаю.
Это, казалось, полная противоположность тому, что я узнал, и попытаться, как я мог, я не мог найти этот точный совет в руководстве по дизайну. Я нашел одну маленькую фигурку:
DO возвращает подкласс
Collection<T>
илиReadOnlyConnection<T>
из очень часто используемых методов и свойств.
С последующим фрагментом кода, но не более оправданием вообще.
Итак, чтобы быть сказанным, является ли это реальным и принятым руководством (как описано в первой цитате блока)? Или это было неверно истолковано? Все другие ответы на вопросы, которые я мог найти, отвечают за выбор типа IEnumerable<T>
. Возможно, исходные рекомендации .NET устарели?
Или, может быть, это не так понятно? Есть ли какие-то компромиссы? Когда было бы хорошей идеей вернуть более конкретный тип? Всегда рекомендуется возвращать конкретный общий тип или только для возврата более конкретного интерфейса, такого как IList<T>
и ReadOnlyCollection<T>
?