IEnumerable
обычно безопасная ставка, если вы не уверены, как люди будут использовать API. Существует множество случаев, когда у пользователя не будет объекта IList
, особенно при использовании вещей из Linq, в дополнение к любым другим коллекциям, кроме списков, таким как LinkedList
или Queue
.
Например, если они делают someList.Select((x) => new OtherThing(x, "test"))
, фильтруют с Where
и т. Д., Тогда они получат IEnumerable
. Хотя в System.Linq
есть также удобное myEnumerable.ToList()
, это дополнительное преобразование, которое им придется выполнять, и оно оказывает некоторое влияние на производительность, возможно, хуже, чем то, которого вы надеялись избежать.
Конечно, бывают случаи, когда из соображений производительности предпочтительнее использовать другие типы, особенно когда имеешь дело с большими объемами небольших значений (например, byte[]
), или упрощаешь реализацию, например, для произвольного доступа или изменения данных.
Вы должны учитывать компромиссы самостоятельно, хотя вы можете черпать вдохновение из стандартных классов и других популярных библиотек для языка. Для публичных библиотек вы также должны быть очень осторожны при рассмотрении бинарной совместимости, например, если вы возвращаете IEnumerable
, тогда вы можете изменить свою реализацию, чтобы использовать другой фактический тип, если вы возвращаете List
или даже IList
затем вы более ограничены в том, что технически возможно без нарушения совместимости.