为什么不。净有一个双向枚举?
-
22-09-2019 - |
解决方案
- IEnumerator支持c#foreach声明以及循环结构的其他语言。
- 没有声明或通用编程语,IBidirectionalEnumerator使能。
其他提示
当你在设计一个框架,你必须做出不同的抽象层次做的东西决定。权衡的是,如果你选择在一个高层次的抽象的东西暴露,你会在失去对事物进行细粒度控制的成本实现泛化。如果您选择在较低的抽象级别暴露的东西,你的概念将不能一概而论很好,但你可以在一个较低的水平控制细节。
这是一个设计决策。实现两者都将是昂贵的,使框架更加臃肿,你需要增加功能时支持。你需要保留在未来的向后兼容性。这不是添加你能想到的一切BCL没有确保一件明智的事情它有显著的好处。
因为没人想过这个,或者没有人认为,这将是特别有用或者因为没有足够的预算或者...
这不是真的有必要的,是吗?你可以很容易地实现它自己。也许BCL队认为这是不值得的痛苦的实施、检测、记录等等。永远不要低估费用的一个特征,这可能听起来"方便",但它的确有成本。
特别是因为一个单一的接口,没有人实现了就会看起来很奇怪,不是吗?你希望清单,列等等。实现接口,这是一个相当大量的工作的结束。
显然,存在不能实现此许多集合类型,如
MoveNext()
是破坏性的或改变底层集合的状态。
MoveNext()
是非破坏性的。事实上,如果底层集合的状态是,IEnumerator
创建的时间和时间MoveNext()
之间改变被调用时,在调用MoveNext()
将失败。
IEnumerator
的目的是遍历所有项目的集合一次,在收集的原始顺序如果集合具有本机命令。 IEnumerator
不打算作为一个集合导航装置,诸如一个可能用C ++找到
此外,这将是这样做的动机是什么?为“落后”迭代语言支持?
在迭代器模式不以一组元素的“方向性”的概念得到的重量。它是用于遍历一组提供了一个简单的界面,一个简单的模式。
一个更大的问题是为什么.NET不执行IReadableByIndex,这将反过来由IList的继承。这种类型的就什么都没有添加到需要以产生工作读写IList的实现方式中,并且将具有减少的需要,以产生工作只读实现(这将实现IReadableByIndex,而不是IList的)。
这不是太有用但是思考这样的“为什么” S。 .NET是它是什么。补救对于.NET 5.0的情况下,唯一的办法是允许声明指出,将实现读写属性可以被视为隐含的接口实现一个只读版本(以便使IList的继承协变的一种手段IReadableByIndex而不必添加显式Get方法)。