当前位置:恩施知识网 > 健康之路 > 正文

为什么不能使用对象本身实现一个枚举器的方法「为什么不能使用对象本身实现一个枚举器」

枚举器的错误实现方式曾经,我看到有人编写了如下的代码来实现一个枚举器,而在枚举器的定义中,他使用了对象本身来实现。让我们来看看如下的代码:
他可能会想着:为什么实现一个对象的枚举器,不能直接使用这个对象本身来实现呢?这样实现起来,不是更加简单吗?
这个说法不正确?为什么?使用代码讲解假设,现在有两个客户同时尝试对你的对象格式进行枚举:那么这两个枚举器实际上是相同的,所以在一个对象上所进行的操作会直接影响另一个对象。例如,考虑下面的看起来有些奇怪的代码段(为了方便对代码进行讲解,我删除了
枚举器的错误实现方式

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

为什么不能使用对象本身实现一个枚举器的方法「为什么不能使用对象本身实现一个枚举器」

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

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

使用代码讲解

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

为什么不能使用对象本身实现一个枚举器的方法「为什么不能使用对象本身实现一个枚举器」

当代码执行到”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》

为什么不能使用对象本身实现一个枚举器的方法「为什么不能使用对象本身实现一个枚举器」

免责申明:以上内容属作者个人观点,版权归原作者所有,不代表恩施知识网立场!登载此文只为提供信息参考,并不用于任何商业目的。如有侵权或内容不符,请联系我们处理,谢谢合作!
当前文章地址:https://www.esly.wang/jiankang/105360.html 感谢你把文章分享给有需要的朋友!
上一篇:大理洱海景观「大理洱海生态长廊的惊艳现世能否解我情人湖之殇」 下一篇:群团服务中心是干什么的「锦州市群团服务中心着力打造文化建设涵养型机关」

文章评论