我正在编写类似于此的代码:
public IEnumerable<T> Unfold<T>(this T seed)
{
while (true)
{
yield return [next (T)object in custom sequence];
}
}
显然,这种方法永远不会返回。(C# 编译器默默地允许这样做,而 R# 给我警告“函数永远不会返回”。)
一般来说,提供一个返回无限数量项目的枚举器,而不提供停止枚举的方法,是不是糟糕的设计?
这种情况有什么特殊的考虑吗?内存?性能?其他陷阱?
如果我们总是提供退出条件,有哪些选项?例如:
- 表示包含或排除边界的 T 类型对象
- 一个
Predicate<T> continue
(一样TakeWhile
) - 一个计数(就像
Take
这样) - ...
我们应该依赖用户调用Take(...)
/ TakeWhile(...)
afterUnfold(...)
吗?(也许是首选选项,因为它利用了现有的 Linq 知识。)
如果代码将按原样(通用)或作为此模式的特定实现在公共 API 中发布,您会以不同的方式回答这个问题吗?