代码如下所示:
namespace Test { public interface IMyClass { ListGetList(); } public class MyClass : IMyClass { public List GetList() { return new List (); } } }
当我运行代码分析时,我得到以下建议.
警告3 CA1002:Microsoft.Design:更改'IMyClass.GetList()'中的'List'以使用Collection,ReadOnlyCollection或KeyedCollection
我应该如何解决这个问题以及这里有什么好的做法?
要回答问题的"原因"部分,为什么不这样做List
,原因是面向未来和API简单化.
面向未来
List
不能通过子类化来轻松扩展; 它旨在快速进行内部实施.你会注意到它上面的方法不是虚拟的,所以不能被覆盖,并且它的Add
/ Insert
/ Remove
操作没有钩子.
这意味着如果您将来需要更改集合的行为(例如,拒绝人们尝试添加的空对象,或者在发生这种情况时执行其他工作,例如更新类状态),则需要更改类型你可以返回一个集合的子集,这将是一个破坏性的接口更改(当然,更改不允许null的事物的语义也可能是一个接口更改,但更新内部类状态的事情不会是).
因此,通过返回可以轻松子类化的类Collection
或者诸如的接口IList
,ICollection
或者IEnumerable
您可以将内部实现更改为不同的集合类型以满足您的需求,而不会破坏消费者的代码,因为它仍然可以作为返回他们期待的类型.
API简单
List
包含许多有用的操作,例如BinarySearch
,Sort
等等.但是,如果这是您正在公开的集合,那么很可能您控制列表的语义,而不是消费者.因此,虽然您的班级内部可能需要这些操作,但您班级的消费者不太可能想要(甚至应该)调用它们.
因此,通过提供更简单的集合类或接口,您可以减少API用户看到的成员数量,并使他们更容易使用.
我个人会声明它返回一个接口而不是一个具体的集合.如果您真的想要列表访问,请使用IList
.否则,考虑ICollection
和IEnumerable
.