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>.
我更喜欢使用List<BusinessObject>.键入它只是为代码添加了不必要的样板. List<BusinessObject>是一种特定的类型,它不仅仅是任何List对象,所以它仍然是强类型的.
更重要的是,声明某些内容List<BusinessObject>可以让每个阅读代码的人更容易分辨出他们正在处理的类型,他们不必搜索以找出它是什么BusinessObjectCollection,然后记住它只是一个列表.通过typedefing,您将不得不要求每个人都必须遵循的一致(重新)命名约定才能使其有意义.