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
    和其他方法如何?如果对象被强制转换回
    列表
    ,该怎么办?