C#泛型:List <Object>或新类扩展List <Object>

Shy*_*yju 6 c# generics class

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

public static List<Product> GetProductList() { .... }
Run Code Online (Sandbox Code Playgroud)

或者在我的Business对象namspace中创建另一个名为ProductList的类,其扩展List <Products>如下:

public class ProductList :List<Products > { .... }
Run Code Online (Sandbox Code Playgroud)

并在那里使用它

public static ProductList GetProductList() { .... }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 10

有一个额外的类型(ProductList)有一个小开销,但没有什么大的.但这实际上取决于你想做什么.在许多方面,ProductList由于它烧List<T>入公共API 仍然是一个坏主意,并且List<T>不是非常可扩展的(virtual例如,没有一种方法).Collection<T>可能有更多的可扩展性选项.

我支持抽象或封装:

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

要么:

public class ProductList : IList<Product> {...} // encapsulation, but need to
                                                // add a lot of dull code
Run Code Online (Sandbox Code Playgroud)

令人遗憾的是,C#并没有使封装方法变得简单(我正在考虑"mixins").

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


小智 7

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

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


Joh*_*ica 5

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

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