作者:拾味湖 | 2023-09-01 16:57
根据FXCop,List不应该在API对象模型中公开.为什么这被认为是不好的做法?
1> Jon Limjap..:
我同意这里的驼鹿:List
是一个不受约束的,膨胀的物体,里面有很多"包袱".
幸运的是,解决方案很简单:IList
相反,暴露.
它暴露了一个具有大多数List
方法(除了类似的东西AddRange()
)的准系统接口,并且它不会限制您使用特定List
类型,这允许您的API使用者使用他们自己的自定义实现者IList
.
为了获得更大的灵活性,请考虑IEnumerable
在适当的时候公开一些集合.
仅仅因为你使用IList
,并不意味着你保存任何内存,如果这是你得到的.使用新的List ()实例化它,IList 变量仍然指向内存中的List .除此之外,我认为封装集合通常是有益的,而不是直接暴露给客户端代码.
但要注意`IList`.[`Array`也实现`IList`](http://stackoverflow.com/q/5968708/210336)并将在`Add`和`Remove`上抛出异常.这可能令人困惑,因为很多人都不会期待这一点.
2> e11s..:
主要有两个原因:
List 是一种相当臃肿的类型,许多成员在许多场景中都不相关(对于公共对象模型来说太"忙").
该类是未密封的,但没有专门设计为扩展(您不能覆盖任何成员)
非常正确.以下是关于Krzysztof Cwalina的链接:http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx
3> Scott Wisnie..:
如果您正在编写将被数千或数百万开发人员使用的API,那么这只被认为是不好的做法.
.NET框架设计指南适用于Microsoft的公共API.
如果您的API没有被很多人使用,您应该忽略该警告.
虽然一些FxCop规则确实是框架设计指南,并且可能不适合某些项目,但即使是为小型团队设计的库也可以从遵循它们中受益.您是否告诉过5位开发人员他们将不得不改变他们的项目,因为您需要对库进行重大更改(比如观察@Kaagle提到的更改)?您的团队中的开发人员是否曾做过您不期望的事情,例如修改您打算只读的列表属性的内容?
如果指南在您的情况下没有意义,请在FxCop项目中禁用它 - 但请查看[指南原因](http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613 )先仔细一点.