Which declaration is best to use, Collection or IEnumerable?
我可以用两种方法编写代码来实现我的目标,但是我想知道哪一种方法是最佳实践?
1
| Collection <MyClass > obj = new Collection <MyClass >(); |
或
1
| IEnumerable <MyClass > obj = new Collection <MyClass >(); |
- 这是一个略有不同的问题,但相关的答案。stackoverflow.com/questions/376708/&hellip;
- 我也要考虑iList和iCollection!IEnumerable可能是最灵活的,但同时也有可能忘记它被懒惰地执行,如果不小心的话,这会导致一些有趣的错误!iList和iCollection可以安全地重申,IEnumerable不是(会导致集合重新生成,例如从DB重新生成时,这是很昂贵的),但是如果只使用一次,它的性能会很好/很快。
在这种情况下,IEnumerable obj = new Collection()完全没有意义,因为您有一个空集合,不能向其中添加项(因为IEnumerable不允许这样做)。这有什么用?
除此之外,如果我们谈论的是一个局部变量,它不会暴露于方法之外的代码,那么唯一重要的是方便性和清晰性。您可以使用第一种形式的等价物来最大化这两种形式:
1
| var obj = new Collection <MyClass >(); |
如果对象暴露于外部代码(例如通过属性或通过方法返回),则应根据类的公共接口选择最有意义的类型。这意味着作为经验法则,您应该使用尽可能不专门化的类型,并且总是喜欢使用接口。
因此,如果您要公开obj,那么如果集合不打算由代码的用户修改,那么应该使用IEnumerable。否则,如果可以的话,应该使用ICollection;如果仍然不够,那么使用IList。
- + 1好抓!!
- 我喜欢记住"我们应该尽可能使用最不专业的类型,并且总是喜欢使用接口。"
这完全取决于需求。如果使用DAL进行延迟或返回数据库对象,则最好使用IEnumerable。
声明为集合将提供更多要添加的功能。你可以在那里得到更多的想法。
我个人认为这取决于你想要达到的特异性水平。
请记住,Collection表示IList, ICollection, IEnumerable, IList, ICollection, IEnumerable。
正如Jon已经指出的那样,您给出的示例没有任何意义,因为您正在创建一个不能添加到其中的空集合,但给出了一个不同的示例,特定性级别开始发挥作用。
集合具有一组特定的成员,如果需要这些成员,请使用它。如果您希望对集合中的数据不那么具体,可以将其强制转换为由Collection实现的任何接口。问题是,如果创建一个Collection,为什么要这样做?
我个人比较喜欢
1
| var obj = new Collection <MyClass >(); |
这甚至可以成功地编译到.NET 2.0和VS.NET 2008及更高版本。
见var文件。