2009-10-27 83 views
5

我有一个名为产品在我的业务对象和另一个类我想返回这个类的对象列表。我应该使用哪种方法?C#泛型:列表<Object>或新类扩展名单<Object>

public static List<Product> GetProductList() { .... } 

或创建我的业务对象namspace另一个类叫做产品列表延伸List <Products>如下:

public class ProductList :List<Products > { .... } 

,并使用它有

public static ProductList GetProductList() { .... } 

有这两者之间有什么区别?内存分配和性能如何?

回答

9

有一个小的开销中有一个额外的类型(ProductList),但没有巨大的。但它真的取决于你想要做什么。在许多方面,ProductList仍然是一个糟糕的主意,因为它燃烧List<T>到公共API,并且List<T>不是很可扩展(没有的方法是virtual,例如)。 Collection<T>可能有更多的可扩展性选项。

我赞成抽象或封装的争论:

public static IList<Product> GetProductList() {...} // abstraction; can return 
                // List<Product> if we want 

或:

public class ProductList : IList<Product> {...} // encapsulation, but need to 
               // add a lot of dull code 

这是一个耻辱,C#不使封装方法简单(我想“混入”)。

注意,另一招(有时是合适的,有时不)是使用扩展方法来添加额外的方法错觉上​​......这是一个棘手的辩论,所以我只是提了,不是说“做这个”。

+0

公共静态的IList GetProductList(){...}是一种方法,但到底是什么公共静态产品列表:IList的 {...}是什么意思? – Max 2009-10-27 13:04:20

+1

这意味着我有一个复制/粘贴错误;-p – 2009-10-27 13:05:00

+0

啊,好吧,我已经担心C#中还有更多的语言结构,我现在还不知道。 ;) – Max 2009-10-27 13:07:57

7

仿制药的目的是,除其他事项外,促进代码重用。你的第一种方法是比较合适的。

我唯一一次采用第二种方法的时候,我不得不将接口实现添加到集合(如IDisposable),添加额外的功能,或者必须将集合序列化到xaml。

0

的分配应该是相同的内存量,但第二个选项是更加灵活,因为它可以让你自定义的方法添加到返回的产品清单。

为了封装(或抽象,谢谢Marc),最好的做法是分别返回​​或实现​​。

5

如果您打算将功能添加到列表中,如更方便的查找方法或特定产品的查询,然后返回自己的ProductList类。

如果没有,就没有必要用自己的类来包装它。相反,你应该返回一个​​或IEnumerable<Product>,越通用越好。这保留了返回一个列表或一组产品的想法,但不会将您与实际的集合实现(链接列表,数组,等等)结合在一起。

2

如果你只是想回报产品的序列,并永远不会使用名单上的任何功能,我建议你使用类似:

public static IEnumerable<Product> GetProductList() 
0

我个人与你的第一个建议,简单地去因为这意味着你没有创建一个新班级。我这样做,因为当一个泛型类可以满足时,它可以防止加载特殊用途类。

public static IList<Product> GetProductList() { .... }

2

微软代码分析建议从收藏< T>而不是列表< T>导出。

This blog post解释了原因。

您可以从收藏< T>派生自己的集合类,原因如下:

  • 要添加其他自定义功能

  • 为了揭露一个标记有ComVisible特性强类型集合类。