C#Generics:List <object>或新类扩展List <object> </object> </object>

时间:2009-10-27 12:56:36

标签: c# generics class

我在Business对象中有一个名为Product的类,在另一个类中我想返回此类对象的列表。我应该使用哪种方法?

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

或在我的业务对象namspace中创建另一个名为ProductList的类,它扩展List <Products>,如下所示:

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

并在那里使用

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

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

7 个答案:

答案 0 :(得分:10)

有一个额外的类型(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#并没有使封装方法变得简单(我在想“mixins”)。

请注意,另一个技巧(有时候是合适的,有时候不合适)是使用扩展方法在IList<Product>上添加额外方法的错觉...这是一个棘手的辩论,所以我只是提到它,不要说“做这个”。

答案 1 :(得分:7)

泛型的目标之一是促进代码重用。你的第一种方法是合适的。

我曾经采用过第二种方法的唯一一次是我必须在集合中添加接口实现(例如IDisposable),添加额外的功能,或者必须将集合序列化为xaml。

答案 2 :(得分:5)

如果您计划向列表添加功能,例如更方便的查找方法或特定于产品的查询,则返回您自己的ProductList类。

如果没有,则无需用自己的课程包装它。相反,您应该返回IList<Product>IEnumerable<Product>,越通用越好。这样可以保留返回列表或产品集合的想法,但不会将您与实际的集合实现(链接列表,数组等)联系起来。

答案 3 :(得分:2)

如果您只想返回产品序列并且永远不会使用列表中的任何功能,我建议您使用以下内容:

public static IEnumerable<Product> GetProductList()

答案 4 :(得分:2)

Microsoft Code Analysis建议从Collection&lt; T&gt;派生。而不是List&lt; T&gt;。

This blog post解释了原因。

您可以从Collection&lt; T&gt;中派生自己的集合类。原因如下:

  • 添加其他自定义功能

  • 公开COMVisible强类型集合类。

答案 5 :(得分:0)

分配的内存量应该相同,但第二个选项更灵活,因为它允许您将自定义方法添加到返回的产品列表中。

为了封装(或抽象,感谢Marc),最好分别返回IList<Product>或实现IList<Product>

答案 6 :(得分:0)

就我个人而言,我会选择你的第一个建议,因为这意味着你没有创建一个新课程。我是这样做的,因为它可以防止在一个泛型类就足够时加载特殊目的类。

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