建议24:迭代器应该是只读的
来源:互联网 发布:知乎 徐达 编辑:程序博客网 时间:2024/05/29 07:11
建议24:迭代器应该是只读的
如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性。原因有二:
一:这违背了设计模式的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。一旦确实需要新的迭代要求,完全可以创建一个新的迭代器来满足需求,而不是为集合设置该迭代器,因为这样做会直接导致使用该集合对象的其他迭代场景发生不可知的行为。
二:现在,我们有了LINQ。使用LINQ可以不用创建任何新的类型就能满足任何的迭代需求。
如果迭代器可写,危害示例如下:
假设存在一个公共集合对象,有两个业务类需要对这个集合进行操作。
业务类A只负责将元素迭代显示到UI上:
private IMyEnumerable list = new MyList(); private IMyEnumerator enumerator = list.GetEnumerator(); while(enumerator.MoveNext()) { int current = enumerator.Current; Console.WriteLine(current.ToString()); }
业务类B出于自己的某种需求,要实现一个新的针对集合对象的迭代器:
private MyEnumerator2 enumerator2 = new MyEnumerator2(list as MyList); (list as MyList).SetEnumerator(enumerator2); while(enumerator2.MoveNext()) { int current = enumerator2.Current; Console.WriteLine(current.ToString()); }
现在再回到业务类A执行一次迭代,结果将会是B所设置的迭代器输出。这相当于B在没有通知A的情况下进行了干扰,这是应该避免的。
事实上,上面的代码即使没有下面这行代码也会运行的很好:
(list as MyList).SetEnumerator(enumerator2);
所以,不要为迭代器设置可写属性。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
0 0
- 建议24:迭代器应该是只读的
- 建议在设计C++类时提供默认构造函数,这应该是个好的习惯
- 足球应该是快乐的
- 应该是什么样的呢?
- 教育应该是这样的
- 生活,应该是快乐的
- 风应该是凉的
- 应该是怎么样的?
- 建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的
- 合格的网管应该是什么样?
- 男人应该是怎样的活法
- 加班应该是这个样子的
- 中国工人的月薪应该是多少?
- 学习应该是很自然的
- 创业应该是水到渠成的结果
- 人类的本质应该是什么
- 只读的Input
- 数据库只读的解决办法
- JavaScript正则表达式下——相关方法
- Java问题答案集合
- Linux守护进程创建
- linux中svn服务器端搭建
- JDK源码分析-java.lang.Boolean
- 建议24:迭代器应该是只读的
- H264视频通过RTMP直播
- Linux命令 - grep
- 高性能流媒体服务器-nebula之数据结构(5)--动态数组DynArray
- Discuz与UCenter通信失败的解决方法
- Ajax初步理解
- 基于redis的坐席调度-会话断线
- Android报错android java.lang.UnsatisfiedLinkError:
- CentOS编译安装PHP开发环境