通过无限循环生成元素返回 IEnumerable<T> 有不利的一面吗?
Is there a down side to returning an IEnumerable<T> via an infinite loop yielding elements?
这里的无限循环是否造成了负面影响? Resharper 警告我..
Function never returns
..但我看不出有任何缺点。
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);
}
}
Is there a downside?
这取决于预期用途。如所写,一些 Linq 函数——主要是 All
和 Count
——永远不会完成。只要消费者有办法在某个时候打破循环,使用延迟执行的 Linq 查询就没问题。客户端必须确保使用确定性函数,例如 Take
或 First
(假设在某个时候 return 值将满足条件)。
如果预期的用途是让客户端使用 foreach
进行枚举,自行决定打破循环,那么无限期 return 项是合理的。
具有 "infinite" 可枚举本身不会导致任何问题。不过,您编写的特定代码看起来很奇怪。我会这样做:
static IEnumerable<long> Iota()
{
long i = 0;
while (true)
{
yield return i;
i++;
}
}
这是通用序列 0, 1, 2, ...
如果你想制作一个无穷无尽的随机字体序列,你可以这样做:
Iota().Select(_ => CreateRandomFont())
这避免了编写您的 Get
方法,这在我看来很糟糕。
这里的无限循环是否造成了负面影响? Resharper 警告我..
Function never returns
..但我看不出有任何缺点。
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);
}
}
Is there a downside?
这取决于预期用途。如所写,一些 Linq 函数——主要是 All
和 Count
——永远不会完成。只要消费者有办法在某个时候打破循环,使用延迟执行的 Linq 查询就没问题。客户端必须确保使用确定性函数,例如 Take
或 First
(假设在某个时候 return 值将满足条件)。
如果预期的用途是让客户端使用 foreach
进行枚举,自行决定打破循环,那么无限期 return 项是合理的。
具有 "infinite" 可枚举本身不会导致任何问题。不过,您编写的特定代码看起来很奇怪。我会这样做:
static IEnumerable<long> Iota()
{
long i = 0;
while (true)
{
yield return i;
i++;
}
}
这是通用序列 0, 1, 2, ...
如果你想制作一个无穷无尽的随机字体序列,你可以这样做:
Iota().Select(_ => CreateRandomFont())
这避免了编写您的 Get
方法,这在我看来很糟糕。