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
类。
如果没有,就没有必要用自己的类包装它。 相反,您应该返回IList
或IEnumerable
,越通用越好。 这样可以保留返回列表或产品集合的想法,但不会将您与实际的集合实现(链接列表,数组等)结合起来。
Microsoft Code Analysis建议从Collection
这篇博客文章解释了原因。
您可以从Collection
-
添加其他自定义function
-
公开COMVisible强类型集合类。
如果您只想返回产品序列并且永远不会使用列表中的任何function,我建议您使用以下内容:
public static IEnumerable GetProductList()
分配的内存量应该相同,但第二个选项更灵活,因为它允许您将自定义方法添加到返回的产品列表中。
为了封装(或抽象,感谢Marc),最佳做法是分别返回IList
或实现IList
。
就个人而言,我会选择你的第一个建议,因为这意味着你没有创建一个新的课程。 我是这样做的,因为它可以防止在一个generics类就足够时加载特殊目的类。
public static IList