Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现无限枚举数和枚举数是一种糟糕的做法吗?_C#_.net_Oop_Ienumerable_Ienumerator - Fatal编程技术网

C# 实现无限枚举数和枚举数是一种糟糕的做法吗?

C# 实现无限枚举数和枚举数是一种糟糕的做法吗?,c#,.net,oop,ienumerable,ienumerator,C#,.net,Oop,Ienumerable,Ienumerator,我有以下课程: class CopyProvider<T> where T: IMyCloneable { private readonly T _original; public CopyProvider(T original) => _original = original; public T Current { get; private set; } public bool MoveNext() { Curre

我有以下课程:

class CopyProvider<T> where T: IMyCloneable
{
    private readonly T _original;

    public CopyProvider(T original) => _original = original;

    public T Current { get; private set; }

    public bool MoveNext()
    {
        Current = _original.Clone();
        return true;
    }
}
事实上,这样做会舒服得多。但是,我再次遇到了同样的问题:IEnumerable的这种用法会破坏接口的语义吗

或者我应该考虑用FuniTeEngEnter和/FieltEnEdaby实现单独的对象结构吗?然而,这将阻止我使用C语法中的sugar-like-yield和foreach


我期待着您的建议。

是的,我认为这确实是一种不好的做法。线程将无法处理任何其他代码路径。这会给处理器带来很大的负担。

如果您的枚举永远不会停止生成结果,那么最好要求开发人员明确说明要生成的最大数量,这样就消除了开发人员对您的枚举使用for-each语法时出现无限循环的风险。e、 g

IEnumerable<T> ProvideCopies<T>(T original, int howMany) where T: IMyCloneable<T>
{
    return Enumerable.Range(1, howMany).Select(x => original.Clone());
}
或者,如果你是老派:

IEnumerable<T> ProvideCopies<T>(T original, int howMany) where T: IMyCloneable<T>
{
    for (var i = 0; i < howMany; i++)
        yield return original.Clone();
}
这样,开发人员就没有义务使用整个枚举,并且可以在任何时候停止,也就是说,您仍然在让步,但您知道它将在某个时候停止,而不是因为代码中的错误而在生产中引入代码永远阻塞的可能性

如果你真的不知道需要多少份拷贝,并且需要一直生成拷贝直到其他东西告诉你停止,那么IObservable更适合这种情况,因为它打算一直监听,直到你处理掉它


为什么/什么会违反接口?而且,我对InfiniteEnumerator毫无意义,为什么它会是无限的?@Camiloterevento为什么它会是无限的?-因为IEnumerator.MoveNext从不返回false。合法的用法可能是中随机值的枚举器。您可以在某些条件下执行random.GetRandomValues.TakeWhilei=>之类的操作。无论如何,这个问题对我来说似乎主要是基于观点,或者可能是重复的。相关:关于MSDN;这里也存档了:问题不是不停止/中断枚举可数无穷大是否不好;-另请参见dbc对该问题的评论中给出的链接
IEnumerable<T> ProvideCopies<T>(T original, int howMany) where T: IMyCloneable<T>
{
    for (var i = 0; i < howMany; i++)
        yield return original.Clone();
}