返回IEnumerable<;T>;通过产生元件的无限循环
本文关键字:无限循环 lt IEnumerable gt 返回 | 更新日期: 2023-09-27 18:25:30
这里的无限循环是否会造成任何负面影响?Resharper警告我。。
函数从不返回
但我看不出有什么不利之处。
public static class RandomEntityFactory
{
public static IEnumerable<T> Enumerate<T>() where T : class
{
while (true)
{
yield return Get<T>();
}
}
public static T Get<T>() where T : class
{
if (typeof(T) == typeof(Client)) return CreateRandomClient() as T;
if (typeof(T) == typeof(Font)) return CreateRandomFont() as T;
throw new Exception("unknown type: " + typeof(T).Name);
}
}
是否存在不利因素?
这取决于预期用途。正如所写的,一些Linq函数——主要是All
和Count
——永远不会完成。只要使用者有办法在某个时刻中断循环,使用延迟执行的Linq查询就可以了。客户端必须确保使用确定性函数,如Take
或First
(假设在某个时刻返回值将满足条件)。
如果预期用途是让客户端使用foreach
枚举,自行中断循环,那么无限期返回项是合理的。
拥有"无限"可枚举对象本身不会引起任何问题。不过,您编写的特定代码看起来非常奇怪。我会这样做:
static IEnumerable<long> Iota()
{
long i = 0;
while (true)
{
yield return i;
i++;
}
}
这是通用序列0、1、2。。。
如果你想制作一个无休止的随机字体序列,你可以这样做:
Iota().Select(_ => CreateRandomFont())
这避免了编写Get
方法,这在我看来很糟糕。