Is returning List<T> from method differ in performance from returning Collection<T>?
我们有一个Web项目,它在名为"bll.dll"的类库项目中包含其业务方法。bll.dll的一些方法返回list<>…从一个消息来源——我现在不记得了——告诉我们返回集合<>比返回列表<>这是有效的吗?注意,我不会对从BLL方法返回的值进行任何处理。只需在网页中查看即可
实现Collection,IIRC作为IList的包装,默认实现为List。因此,一个Collection比一个List至少有一个抽象,但一般来说,这不会是一个瓶颈。实际上,您可以考虑退回IList。
编辑:这里是Collection的构造函数,由reflector提供:
1 2 3 4
| public Collection ()
{
this.items = new List <T >();
} |
因此,这确实包含了一个抽象层。另一方面,您可以通过将Collection子类化来添加自己的验证等(这在直接使用List或通过子类化时是不可能的,因为没有有趣的virtual方法)。
另一个需要考虑的是,它们在"o"方面具有相同的总体性能(假设您使用默认的List实现)。索引器查找将是O(1)等
- 你说的IIRC是什么意思?你看到我的情况最好吗?
- 请参见en.wiktionary.org/wiki/iirc;是的,除非您有使用具体返回类型的特定需求,否则IList是一个不错的选择—它使您能够灵活地使用任何实现,而客户机不必知道它。所以你可以把它公开为IList,但现在归还List,以后可以自由地替换其他东西(Collection、MyCustomFooCollection等)。
实际上,您应该只返回满足您在设计API时设置的目标的接口。例如,如果您只希望客户机迭代一个集合,那么返回IEnumerable。关于你的具体问题,我觉得ICollection有点无用,因为它缺少索引器。
- 您如何知道客户端只想遍历集合?也许他们想把它作为一个收藏。或者只是数数。如果您以后想公开其他属性怎么办?由于这些原因和其他原因,微软的框架设计指南建议完全相反。
- @Jonathon——膨胀框架的一个问题是,设计人员试图把所有用例都覆盖得很差,而不是把注意力集中在一件事情上。如果你愿意的话,可以随意盲目地遵循微软的指导方针。
- 如果您有一个集合,那么您只需向客户提供一个IEnumerable,就不会做任何事情来减少膨胀。事实上,您增加了blost,因为现在他们要么创建自己的集合,要么检测到您给了他们一个集合并对其进行了强制转换。
最好的做法是公开像CustomerCollection这样的强类型类。这样,以后您就可以添加属性和方法了。
正式地说,你不应该公开一个清单,但我个人认为它没有问题。
- 为什么不使用仿制药?
- 那么,customerCollection将从objectmodel.collection继承。至于list,我只知道list。
- 好吧,您必须明确声明一个customerCollection,它是从collection中派生出来的,但我不确定这会给您带来什么样的回报。
- 如果您以后想向集合本身添加"totalDollarsExpended"属性,该怎么办?您不能对IList执行此操作。
- 没错,但我也不想这样。总计是派生值。
- 如果您经常使用total,则可以使它成为封装操作的只读属性。
返回列表的问题是调用方可以修改它。如果您希望连接一些通知机制("每当调用者向其添加新对象时通知被调用者"),则不能将列表视为死胡同。
返回集合/ICollection允许您创建具有所需内容的自己的实现。
基本上,一个列表意味着你被困在一个你无法逃脱的角落,没有一个突破性的改变。
因此,collection/icolection/ilist更可取。
请看这个问题和这篇文章。
- 您可以以只读方式返回列表,它是一个IList。当然,这个瘦包装器可能会有一些微不足道的开销。
更好的方法可能不适用于性能,而只适用于返回类型的类型。
在这种情况下,要说什么更好并不容易,在我看来,依赖于方法"localy"的使用,更适合于返回我们操作的类型。