什么时候返回延迟的IEnumerable <T>是不好的形式

jos*_*rry 12 .net c# linq

我很好奇,如果有任何人有任何经验法则或最佳实践,在返回延迟IEnumerable<T>或ToArray()在从函数返回它之前调用它是有意义的.

例如,作为一个API的消费者,我认为我更喜欢一个方法,比如当我调用它时IEnumerable<Widget> GetWidgets()抛出一个方法HttpException而不是在我枚举结果时抛出它.

public IEnumerable<Widget> GetWidgets(IEnumarable<int> widgetIds) {
    return widgetIds.Select(id => GetWidgetFromWidgetWebService(id));
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 6

我总是喜欢在延迟IEnumerable<T>没有明显副作用的情况下返回延期.例如,如果可枚举基于可能会发生变化的内部集合,我宁愿首先对其进行评估.

但是,如果计算可枚举数等,那么我通常会推迟它.

  • @JonB唯一的问题是,返回`IEnumerable <T>`只告诉调用者"嘿,这是一个通过T类型事物列表的接口"它不会传达它可能是延迟的.我不知道呼叫者如何能够获得足够的信息来就是否尽快实现列表做出明智的决定. (4认同)
  • 一个例外是当你将`IEnumerable`传递给一个上下文时,它不会_possible_枚举它.例如,当使用EF上下文生成`IEnumerable <T>时,该上下文将在枚举时被处理.除此之外,我同意将其推迟更适合作曲. (2认同)