C# 您会定义集合类型吗?如果会,如何定义?
如果您经常在程序中使用集合,您会选择哪种路径:C# 您会定义集合类型吗?如果会,如何定义?,c#,.net,C#,.net,如果您经常在程序中使用集合,您会选择哪种路径: 在任何地方键入列表 定义类: class TT:List<T> { } class TT { private List<T> _tt; // ... } TT类:列表 { } 定义类: class TT:List<T> { } class TT { private List<T> _tt; // ... } TT类 { 私人名单; // ... } 我认为这不是很重
列表
class TT:List<T>
{
}
class TT
{
private List<T> _tt;
// ...
}
TT类:列表
{
}
class TT:List<T>
{
}
class TT
{
private List<T> _tt;
// ...
}
TT类
{
私人名单;
// ...
}
我认为这不是很重要,但在上一个项目之后,我开始经常考虑它。如果它将添加其他功能,您应该只创建自己的集合类 创建自己的集合类时,应该从列表继承,而不是从
列表继承
继承此类允许您重写InsertItem
和removieItem
,并在修改集合时运行自定义逻辑。(这在继承列表时是不可能的)如果我只需要一个列表,我使用1。如果我想添加额外的方法和限制,我将定义2不要子类List
——这几乎总是不正确抽象的症状。让列表成为一个列表,仅此而已。我不知道您为什么要使用第三个选项。您可以根据需要使用指定的任何选项:
(1) 若需要使用列表,则集合的类型不会更改
(2) 如果您想用附加功能扩展集合,则应该使用继承
(3) 若您需要创建额外的抽象级别。在这种情况下,您的集合将只是实现细节,例如,您将能够在将来更改集合上的列表。与所有内容一样,存在权衡。使用包装类(封装)列表的好处是将对它的访问军事化。这意味着要做很多工作:
- 您必须添加特定的方法才能从列表中添加和删除
- 您必须添加迭代器方法,并可能在迭代时修改语法
所有这些成本都必须有目的。如果您想要截取列表中的插入和删除,或者如果您想要创建自己的方法来过滤列表等等,您可以这样做。也许你需要一个不变的列表。确保您有足够的理由经历创建包装器类的麻烦
最后,正如SLaks所说,继承集合
比围绕列表更好。我不知道真正的区别,但我不同意这种选择。选项(1)有什么问题/顾虑?经常使用列表时,定义自定义类似乎不错。@Johntz:请解释为什么“定义自定义类似乎不错”。我使用类层次结构。每个元素都包含对父元素的引用。类流{公共熔炉{get;set;};类熔炉{公共流{get;set;}公共熔炉区{get;set;};公共熔炉区{公共熔炉{get;set;}公共存储系统{get;set;}等等…@JohnKZ:我看不出定义一个自定义类来包装列表
(请使用“@Jason”回复时,以便在您回复时通知我。一般来说,如果您回复某人,则应使用“@username”,以便他们收到通知。)柯克,既然你永远不会使用#2,那么你如何定义集合?然后从头开始编写所有代码?等等,他不是在对列表进行子类化,而是在封装它。@Bruno,选项2是从列表继承的,选项3是封装的。这两个都讨论过了。@Brad,嗯?我的观点是,我很少需要定义新的collections.我的建议是使用列表
。一点也不跟随你…我不明白你建议实施选项1。你是否看到@SLaks建议继承System.Collections.ObjectModel.Collection
类而不是System.Collections.Generic.List
?这能解决问题吗“不正确的抽象”?你能解释一下“军事化”这个词吗“?我以前从未在这种情况下遇到过它。@Steve:我想他是想保护它。+1用于照亮System.Collections.ObjectModel.Collection
class@JohnKZ:关于AddRange
、Insert
、InsertRange
和其他方法如何?如果对象被强制转换回列表
,该怎么办?