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();
}