枚举工具不能使用是什么原因(使用枚举法解决问题)枚举工具不能使用是什么原因(使用枚举法解决问题)

关注健康
关注真实体验

枚举工具不能使用是什么原因(使用枚举法解决问题)

枚举工具不能使用是什么原因(使用枚举法解决问题)

枚举器的错误实现方式

曾经,我看到有人编写了如下的代码来实现一个枚举器,而在枚举器的定义中,他使用了对象本身来实现。让我们来看看如下的代码:

他可能会想着:为什么实现一个对象的枚举器,不能直接使用这个对象本身来实现呢?这样实现起来,不是更加简单吗?

这个说法不正确?为什么?

使用代码讲解

假设,现在有两个客户同时尝试对你的对象格式进行枚举:那么这两个枚举器实际上是相同的,所以在一个对象上所进行的操作会直接影响另一个对象。例如,考虑下面的看起来有些奇怪的代码段(为了方便对代码进行讲解,我删除了一些错误处理代码),这段代码展示了在多个方面看来这个数据对象暴露了相同的数据。

当代码执行到”penum2->Reset()”这个语句时,这将同时意外地重置第一个枚举器。代码中的循环代码会遍历penum2(因为它们使用了同一个对象进行实现,所以也会对penum1进行遍历),当遍历结束的时候,两个枚举器都会到达列表尾部。

这个时候,当我们对第一个枚举器penum1执行Next操作的时候,因为此时penum1已经是尾部了,所以Next操作会立即失败。

这个故事的结局:代码不会像预想的那样查询到任何有用的东西,因为第二个枚举器已经破坏了第一个,遍历的代码压根就不会成功。

总结

就如同指针或者引用一样,对指针或引用的操作,将会直接影响对象。
你不能释放一个指针两次,就是这个道理。
操作系统对待这种逻辑错误,可不会那么仁慈。
有道是:崩溃来得越早越好,这样距离直接错误现场就越近,Debug也相对容易。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why an object cannot be its own enumerator》

未经允许不得转载: 九月健康网» 枚举工具不能使用是什么原因(使用枚举法解决问题)
分享到: 更多 ( 0)