Jon*_*n B 11 .net c# generics collections
通常我需要一组带有数字标识符的非顺序对象.我喜欢使用KeyedCollection,但我认为这有一个严重的缺点.如果对密钥使用int,则不能再通过索引访问集合的成员(集合[index]现在真的是集合[key]).这是一个严重的问题,以避免使用int作为键?什么是更好的选择?(也许是int.ToString()?)
我以前做过没有什么大问题,但最近我打了一个讨厌的障碍,其中对一个KeyedCollection XML序列化并没有如果,关键是一个int,由于工作在.NET中的错误.
基本上你需要决定这个类的用户是否可能因为他们不能这样做而感到困惑,例如:
for(int i=0; i=< myCollection.Count; i++)
{
... myCollection[i] ...
}
Run Code Online (Sandbox Code Playgroud)
虽然他们当然可以使用foreach,或使用演员:
for(int i=0; i=< myCollection.Count; i++)
{
... ((Collection<MyType>)myCollection)[i] ...
}
Run Code Online (Sandbox Code Playgroud)
这不是一个简单的决定,因为它很容易导致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团队成员的回复,但没有确凿的指导方针.
| 归档时间: |
|
| 查看次数: |
1661 次 |
| 最近记录: |