Ian*_*oyd 27 c# collections icollection
遵循公共API永远不会返回列表的规则,我正在盲目转换返回列表的所有代码,ICollection<T>而是返回:
public IList<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
变
public ICollection<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
虽然a ICollection有a Count,但是没有办法通过该索引获取项目.
虽然ICollection公开了一个枚举器(允许foreach),但我不能保证枚举的顺序从列表的"顶部"开始,而不是"底部".
我可以通过避免使用来减轻这种情况ICollection,而是使用Collection:
public Collection<T> Commaseparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
这允许使用Items[index]语法.
不幸的是,我的内部实现构造了一个数组; 我可以被转换为返回IList或ICollection,但不作为Collection.
有没有办法按顺序访问集合的项目?
这引出了一个更广泛的问题:是否一个ICollection的,即使有订单?
从概念上讲,想象一下我想解析一个命令行字符串.保持物品的顺序至关重要.
从概念上讲,我需要一个表示"有序"字符串元组集的契约.在API合同的情况下,为了表明订单,以下哪项是正确的:
IEnumerable<String> Grob(string s)
ICollection<String> Grob(string s)
IList<String> Grob(string s)
Collection<String> Grob(string s)
List<String> Grob(string s)
Run Code Online (Sandbox Code Playgroud)
pho*_*oog 15
该ICollection<T>接口不指定有关订单的任何东西.对象将按返回的对象指定的顺序排列.例如,如果返回a的Values集合SortedDictionary,则对象将按照字典的比较器定义的顺序.
如果您需要通过契约返回合同需要某个订单的类型的方法,那么您应该通过返回更具体的类型在方法的签名中表示.
无论返回的对象的运行时类型如何,请考虑静态引用时的行为IList<T>或ICollection<T>:当您调用时GetEnumerator()(可能隐式地在foreach循环中),您将调用相同的方法并获取相同的对象,而不管静态参考类型.因此,无论CommaSeparate()方法的返回类型如何,它都将以相同的方式运行.
额外的想法:
正如其他人指出的那样,FXCop规则警告不要使用List<T>,而不是IList<T>; 你联系的问题是询问为什么FXCop不建议使用IList<T>代替List<T>,这是另一回事.如果我想你正在解析一个命令行字符串,其中顺序很重要,IList<T>如果我是你,我会坚持.
ICollection没有保证顺序,但实际实现它的类可能(或可能不).
如果你想要返回一个有序的集合,那么返回一个IList<T>并且不要太依赖FxCop通常合理但非常通用的建议.
| 归档时间: |
|
| 查看次数: |
9931 次 |
| 最近记录: |