什么叫集合
集合是指可以在运行时添加、修改和删除数据的数据结构,在.NET中最常见的就是Collection、List和Dictionary。关于集合的基本概念我就不在此谈论,大家可以看看MSND,或参考:
.NET 2.0泛型集合类与.NET 1.1集合类的区别(一)
.NET 2.0泛型集合类与.NET 1.1集合类的区别(二)
.NET 2.0泛型集合类与.NET 1.1集合类的区别(三)
这篇文章中我将重点说明如何设计良好的集合。
设计良好的集合
l 可达的
所谓可达的,就是指你的集合实例必须能够被访问到,例如在Word中你可以通过下面的句子访问到所有的文档:
Application.Documents
l 可控制的
如果需要,你的集合类还应该包含必要的访问方法,例如Add、索引和Remove方法,这些使外界可以控制集合。
l 强健的
你的集合对外界的访问必须是强健的,这不仅仅包括集合的强类型,还包括诸如没有中间状态,例如最好不要这样设计:
Windows.Add(new Window());
Windows.EndAdd();
上面的例子中如果没有及时调用EndAdd就可能造成中间状态,如果你为了提高性能,你可以不使用Begion/End的设计方式,而是允许传入一个数组的方式批量加入。
通常你不应该公开不需要的变量。
l 可跟踪的(增强)
这一点不是必须的,实现IBindingList可以让外界跟踪集合的变化,但你必须在性能上作出牺牲(当然牺牲并不大)。
l 延迟填充(增强)
并不是所有的集合实例总是在内存中一直存在,有些集合可能生命周期很短,例如环境菜单,他需要在点击右键时才能决定如何构建菜单,点击后集合也不再需要。另外一种需要预先填充数据的集合,例如包含所有实体类型定义的集合,包含所有数据库连接的集合,他们也适合使用延迟加载技术。
通常你可以在集合中设计一个Reset方法,并包含Reseting事件,在事件参数中包含集合本身。这样外界就可以拦截此事件以便填充必要的默认数据。