根据FXCop,List不应该在API对象模型中公开。为什么这被认为是不好的做法?
答案 0 :(得分:51)
我同意这里的麋鹿:List<T>
是一个不受限制的,膨胀的物体,里面有很多“包袱”。
幸运的是,解决方案很简单:改为使用IList<T>
。
它公开了一个包含大多数List<T>
方法的准系统接口(AddRange()
之类的事情除外)并且它不会限制您使用特定的List<T>
类型,允许您的API使用者使用他们自己的IList<T>
的自定义实现者。
为了获得更大的灵活性,请考虑在适当时将某些集合公开给IEnumerable<T>
。
答案 1 :(得分:25)
主要有两个原因:
答案 2 :(得分:5)
如果您正在编写将由数千或数百万开发人员使用的API,那么这只被认为是不好的做法。
.NET框架设计指南适用于Microsoft的公共API。
如果你的API没有被很多人使用,你应该忽略警告。
答案 3 :(得分:3)
我认为您不希望您的消费者在您的回报中添加新元素。 API应该清晰完整,如果它返回一个数组,它应该返回确切的数据结构。我不认为它与T有任何关系,而是返回List&lt;&gt;而不是直接的数组[]
答案 4 :(得分:2)
一个原因是因为List不是你可以模拟的东西。即使在不太流行的库中,由于此建议,我已经看到用于将List对象公开为IList的迭代,并且在以后的版本中决定不将数据存储在列表中(可能在数据库中)。因为它是一个IList,改变客户端下的实现并让每个人都在工作并不是一个重大改变。
答案 5 :(得分:2)
其中一个原因是用户将能够更改列表,列表的所有者将不知道这一点,而在某些情况下,它必须在向/从列表中添加/删除项目后执行一些操作。即使现在不需要,它也可能成为未来的要求。因此,最好将AddXXX / RemoveXXX方法添加到类的所有者,并将列表暴露给IEnumerable或(在我看来更好)将其公开为IList并使用来自WindowsBase的ObservableCollection。