列出<BusinessObject>或BusinessObjectCollection?

Fly*_*wat 45 .net c# generics collections class-design

在C#泛型之前,每个人都会通过创建实现IEnumerable的集合库来为其业务对象编写集合

IE:

public class CollectionBase : IEnumerable
Run Code Online (Sandbox Code Playgroud)

然后从中派生出他们的Business Object集合.

public class BusinessObjectCollection : CollectionBase
Run Code Online (Sandbox Code Playgroud)

现在使用通用列表类,是否有人只使用它?我发现我使用了两种技术的妥协:

public class BusinessObjectCollection : List<BusinessObject>
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我喜欢强类型名称而不是仅仅传递列表.

你的方法是什么?

Sco*_*ski 49

我通常只是直接使用List的阵营,除非由于某种原因我需要封装数据结构并提供其功能的有限子集.这主要是因为如果我没有特定的封装需求,那么这样做只是浪费时间.

但是,使用C#3.0中的聚合初始化功能,我会提倡使用自定义集合类的一些新情况.

基本上,C#3.0允许任何实现IEnumerable并具有Add方法的类使用新的聚合初始化器语法.例如,因为Dictionary定义了一个方法Add(K key,V value),所以可以使用以下语法初始化字典:

var d = new Dictionary<string, int>
{
    {"hello", 0},
    {"the answer to life the universe and everything is:", 42}
};
Run Code Online (Sandbox Code Playgroud)

该功能的优点在于它适用于添加任意数量参数的方法.例如,给定此集合:

class c1 : IEnumerable
{
    void Add(int x1, int x2, int x3)
    {
        //...
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

可以像这样初始化它:

var x = new c1
{
    {1,2,3},
    {4,5,6}
}
Run Code Online (Sandbox Code Playgroud)

如果您需要创建复杂对象的静态表,这可能非常有用.例如,如果您刚刚使用List<Customer>并且想要创建客户对象的静态列表,则必须如此创建它:

var x = new List<Customer>
{
    new Customer("Scott Wisniewski", "555-555-5555", "Seattle", "WA"),
    new Customer("John Doe", "555-555-1234", "Los Angeles", "CA"),
    new Customer("Michael Scott", "555-555-8769", "Scranton PA"),
    new Customer("Ali G", "", "Staines", "UK")
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用自定义集合,如下所示:

class CustomerList  : List<Customer>
{
    public void Add(string name, string phoneNumber, string city, string stateOrCountry)
    {
        Add(new Customer(name, phoneNumber, city, stateOrCounter));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下语法初始化集合:

var customers = new CustomerList
{
    {"Scott Wisniewski", "555-555-5555", "Seattle", "WA"},
    {"John Doe", "555-555-1234", "Los Angeles", "CA"},
    {"Michael Scott", "555-555-8769", "Scranton PA"},
    {"Ali G", "", "Staines", "UK"}
}
Run Code Online (Sandbox Code Playgroud)

这样做的优点是更容易键入和更容易阅读,因为它们不需要为每个元素重新键入元素类型名称.如果元素类型长或复杂,则优点可以特别强.

话虽这么说,但只有在您需要在应用中定义的静态数据集合时,这才有用.某些类型的应用程序(如编译器)会一直使用它们.其他人,如典型的数据库应用程序,因为他们从数据库加载所有数据.

我的建议是,如果您需要定义静态对象集合,或者需要封装集合接口,则创建自定义集合类.否则我会直接使用List<T>.


Dar*_*opp 14

建议,在公共API不使用List <T>,而是利用收集<T>

如果你继承它,你应该没事,afaik.


tgh*_*ghw 9

我更喜欢使用List<BusinessObject>.键入它只是为代码添加了不必要的样板. List<BusinessObject>是一种特定的类型,它不仅仅是任何List对象,所以它仍然是强类型的.

更重要的是,声明某些内容List<BusinessObject>可以让每个阅读代码的人更容易分辨出他们正在处理的类型,他们不必搜索以找出它是什么BusinessObjectCollection,然后记住它只是一个列表.通过typedefing,您将不得不要求每个人都必须遵循的一致(重新)命名约定才能使其有意义.