我可以用两种方式编写代码来实现我的目标,但想知道哪一种是最好的做法?
Collection<MyClass> obj = new Collection<MyClass>();
或者
IEnumerable<MyClass> obj = new Collection<MyClass>();
在这种情况下,IEnumerable<MyClass> obj = new Collection<MyClass>()
根本没有任何意义,因为您有一个无法添加项目的空集合(因为IEnumerable
不允许这样做)。这有什么用?
除此之外,如果我们谈论的是不会暴露给方法之外的代码的局部变量,那么唯一重要的是方便和清晰。您可以通过使用第一种形式的等效项来最大化这两种情况:
var obj = new Collection<MyClass>();
如果对象暴露给外部代码(例如,通过属性,或者如果它由方法返回),那么您应该选择对给定类的公共接口最有意义的类型。这意味着,根据经验,您应该尽可能使用最少专业化的类型,并且始终首选接口。
因此,如果您要公开obj
您应该使用IEnumerable
如果集合不打算由您的代码的用户修改。否则,您应该尽可能使用ICollection
;如果还不够的话IList
。
我个人认为这取决于您想要达到的特异性水平。
谨记Collection<T>
暗示IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
。
正如乔恩已经指出的那样,您给出的示例没有任何意义,因为您正在创建一个无法添加的空集合,但给出了一个不同的示例,特异性水平开始发挥作用。
Collection 有一组特定的成员,如果需要这些成员,请使用它。如果您想对集合中的数据不那么具体,您可以强制转换为 Collectioin 实现的任何接口。问题是,如果您正在创建一个Collection<T>
.
这完全取决于要求。如果处理 DAL 或返回数据库对象,则 IEnumerable 更可取。
声明为 Collection 将提供更多功能。 你可以在那里得到更多的想法。