基本上,您需要确定该类的用户是否可能会因为他们不能这样做而感到困惑,例如:
for(int i=0; i=< myCollection.Count; i++)
{
... myCollection[i] ...
}
尽管他们当然可以使用 foreach 或使用演员表:
for(int i=0; i=< myCollection.Count; i++)
{
... ((Collection<MyType>)myCollection)[i] ...
}
这不是一个容易的决定,因为它很容易导致 heisenbugs。我决定在我的一个应用程序中允许它,该类用户几乎完全通过密钥访问。
我不确定我是否会为共享类库这样做:一般来说,我会避免在公共 API 中公开 KeyedCollection:相反,我会在公共 API 中公开 IList<T>,并且 API 的使用者需要键控访问可以使用构造函数定义自己的内部 KeyedCollection,该构造函数采用 IEnumerable<TItem> 并用它填充集合。这意味着您可以轻松地从从 API 检索的列表中构建新的 KeyedCollection。
关于序列化,我向 Microsoft Connect 报告了一个性能问题:KeyedCollection 维护一个内部字典和一个列表,并序列化两者 - 序列化列表就足够了,因为可以轻松地在反序列化时重新创建字典。
由于这个原因以及 XmlSerialization 错误,我建议您避免序列化 KeyedCollection - 而只序列化 KeyedCollection.Items 列表。
我不喜欢将您的 int 键包装在另一种类型中的建议。在我看来,简单地添加复杂性以便可以将类型用作 KeyedCollection 中的项目是错误的。我会使用字符串键 (ToString) 而不是这样做 - 这很像 VB6 Collection 类。
FWIW,我前段时间在 MSDN 论坛上问过同样的问题。FxCop 团队的一名成员做出了回应,但没有决定性的指导方针。