Почему перечисляется .tolookup <> () Возврат ilookup <,> а не поиск <,>?

StackOverflow https://stackoverflow.com/questions/3850469

  •  27-09-2019
  •  | 
  •  

Вопрос

Там есть один метод внутри Lookup<,> это не в ILookup<,>:

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

Почему возвратный тип Enumerable.ToLookup<>() объявлен ILookup<,> Несмотря на то, что всегда, кажется, возвращает экземпляр Lookup<,>? Если бы тип возврата был объявлен Lookup<,>, Вышеуказанный метод может быть использован без литья.

Это было полезно?

Решение

Лучшие практики для проектирования публичных API диктовать, что возвращение интерфейса является лучшей идеей, чем возвращение конкретного класса, потому что вы можете вернуть другой конкретный класс, если вам нужно. Потребитель API не должен полагаться на возвращенный экземпляр, являющийся конкретным типом.

Как вы указываете, ToList и ToDictionary Вернуть бетонные типы, а не интерфейсы. Возможно, причина этого в том, что ToList и ToDictionary должны были вернуть вам копию, которую вы можете модифицировать Если вы хотите. Поскольку IList и IDictionary Интерфейсы не гарантируют вам, что они редактируются (что, возможно, была плохой идеей), дизайнеры решили вернуть конкретный тип.

Представьте себе гипотетику ToIList() метод. При вызове на массиве его можно будет реализовать, чтобы вернуть вам копию массива, потому что массивы внедряют IList<T>. Отказ Затем вы можете быть удивлены, узнав, что вызывает Add() броски.

С другой стороны, ILookup Это интерфейс только для чтения, поэтому приведенное выше не применяется. Следовательно, нет причин нет Следовать наилучшей практикой, как есть с ToList.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top