我很好奇是否有人有任何经验法则或最佳实践,说明何时返回延迟IEnumerable<T>
或在从函数返回之前调用ToArray()
有意义。
例如,作为 API 的使用者,我认为我更喜欢像IEnumerable<Widget> GetWidgets()
这样的方法在调用它时抛出HttpException
,而在枚举结果时不让它抛出。
public IEnumerable<Widget> GetWidgets(IEnumarable<int> widgetIds) {
return widgetIds.Select(id => GetWidgetFromWidgetWebService(id));
}
我总是喜欢在延迟没有明显副作用的情况下返回延迟IEnumerable<T>
。 例如,如果枚举项基于可能会更改的内部集合,则我更愿意先对其进行评估。
但是,如果正在计算可枚举项等,那么我通常会推迟它。
如果你的枚举对象实际上可以预期抛出,请急切地评估它(如果可能的话)。您不希望错误发生在与错误原因无关的远程位置。您希望错误就在导致错误的地方。
毕竟,该方法没有完成其名称所宣传的内容,因此应该抛出。
在这种情况下,我通常会将返回类型更改为IList<T>
以记录它急切地执行。