返回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);
    }
}

返回IEnumerable<;T>;通过产生元件的无限循环

是否存在不利因素?

这取决于预期用途。正如所写的,一些Linq函数——主要是AllCount——永远不会完成。只要使用者有办法在某个时刻中断循环,使用延迟执行的Linq查询就可以了。客户端必须确保使用确定性函数,如TakeFirst(假设在某个时刻返回值将满足条件)。

如果预期用途是让客户端使用foreach枚举,自行中断循环,那么无限期返回项是合理的。

拥有"无限"可枚举对象本身不会引起任何问题。不过,您编写的特定代码看起来非常奇怪。我会这样做:

static IEnumerable<long> Iota()
{
    long i = 0;
    while (true)
    {
        yield return i;
        i++;
    }
}

这是通用序列0、1、2。。。

如果你想制作一个无休止的随机字体序列,你可以这样做:

Iota().Select(_ => CreateRandomFont())

这避免了编写Get方法,这在我看来很糟糕。