C#generics:List 或新类扩展List

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

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

或者在名为ProductList的Business对象namspace中创建另一个类,它扩展List ,如下所示:

 public class ProductList :List { .... } 

并在那里使用它

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

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

有一个额外的类型( ProductList )有一个小的开销,但没有什么大的。 但这实际上取决于你想做什么。 在许多方面, ProductList仍然是一个坏主意,因为它将List刻录到公共API中,而List不是非常可扩展的(例如,没有一个方法是virtual )。 Collection可能具有更多可扩展性选项。

我支持抽象或封装:

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

要么:

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

令人遗憾的是,C#并没有使封装方法变得简单(我在想“mixins”)。

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

除其他事项外,generics的目标是促进代码重用。 你的第一种方法是合适的。

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

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

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

Microsoft Code Analysis建议从Collection 而不是List 派生。

这篇博客文章解释了原因。

您可以从Collection 派生自己的集合类,原因如下:

  • 添加其他自定义function

  • 公开COMVisible强类型集合类。

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

 public static IEnumerable GetProductList() 

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

为了封装(或抽象,感谢Marc),最佳做法是分别返回IList或实现IList

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

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