【问题标题】:Are non-generic collections in .NET obsolete?.NET 中的非泛型集合是否已过时?
【发布时间】:2010-09-08 13:18:40
【问题描述】:

换个说法:

是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable 与 Dictionary)?它们仍然只是为了兼容性吗?

据我了解,泛型集合不仅类型安全,而且性能更好。


这是关于该主题的综合文章:An Extensive Examination of Data Structures Using C# 2.0

【问题讨论】:

    标签: .net generics collections


    【解决方案1】:

    快到 2022 年了,我不得不编写一个 COM Visible Non-Generic 集合类,供一个用 VB6 编写的大型前端商用程序使用——非泛型集合类的这种消费者的主要示例。所以我认为这些类型的类的需求不会很快消失,因为那里仍然有很多活动的 VB6 代码。

    同时,使用 ArrayList 和 IList 来支持自定义集合类,并在处理它们之前检查各个项目是否属于您期望的类型,例如

    [ComVisible(true)] 公共类 MyNonGenericCollection:ArrayList,IList { 私有 ArrayList myList = new ArrayList();

    ...

    public int Add(object myItem)
    {
        if (!(myItem is MyItemClass))
            throw new ArgumentException(nameof(myItem));
    
        // code to add to the ArrayList
    

    }

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    在某些情况下,您可能需要存储未知类型的对象或多种不同类型的对象,但如果您确实知道要存储的对象的类型,那么我看不出有理由不使用通用版本。

    编辑:正如评论所说,您可以使用List<Object> - doh!

    【讨论】:

    • 如果您需要此功能,只需创建 类型的泛型即可获得旧功能。总是使用泛型会让你的意图更清晰。
    【解决方案3】:

    COM 可见性也存在问题 - COM 互操作不能与泛型一起使用

    【讨论】:

      【解决方案4】:

      我可以告诉你,集合的 XAML 序列化依赖于它们实现 IList 或 IDictionary,因此非泛型集合将在未来一段时间内与我们同在。

      【讨论】:

        【解决方案5】:

        我不会跳槽说它已经过时或将很快被删除。 确实应该避免使用非泛型集合,除非您有理由不使用泛型版本。数以千计的遗留(不是那么遗留)代码仍然在(并且将持续数年)支持非泛型集合,如 ArrayLists。由于这些是 .NET 1.0 和 1.1 中的唯一集合,因此全年都被广泛使用(和滥用)。

        我仍然偶尔需要与用 .NET 1.1 编写的返回 IList 对象的旧 O/R 映射器进行交互。我有一个方法可以转换为通用 List,它效率不高,但就是这样。

        如果您需要将不同的对象存储在同一个数组中(奇怪但可能),您需要一个非泛型集合。装箱和拆箱的罚款是你无论如何都必须支付的。

        如果你觉得有必要,不要害怕使用它们。

        【讨论】:

        • 如果您需要将不同的对象存储在同一个数组中(很奇怪但可能),您将需要一个非泛型集合。
          呃,不。创建一个专门用于 Object 的通用集合就可以了。
        【解决方案6】:

        关于使用非泛型集合来存储异构的东西集合,你总是可以使用 List 来完成同样的事情。仅出于这个原因,我想说几乎没有理由再接触非泛型集合。

        这方面的例外是保持与用其他语言编写的系统或与以前版本的 .NET 框架的兼容性,但如果你问我,这是一个非常“前卫”的情况。

        【讨论】:

          【解决方案7】:

          以后只应使用泛型集合。避免对集合中的类型进行装箱/拆箱还有一个好处。这是低效的,尤其是当您有一组值类型在存储在集合中时转换为 System.Object 时,因此将值存储在堆上而不是调用堆栈上。

          【讨论】:

          • 装箱/拆箱适用于值类型。
          • 而且泛型不能与 Com Interop 一起使用。
          • System.Collections.BitArray。通用等价物?相比之下,List<bool> 似乎非常节省空间。
          【解决方案8】:

          非泛型集合非常过时,已从 Silverlight 和 Live Mesh 中使用的 CoreCLR 中删除。

          【讨论】:

          • System.Collections.BitArray 怎么样?没有真正的通用等价物。
          • @Triynko BitArray 是具有特殊用途的布尔值的强类型集合,而不是像 OP 所说的松散类型的高度抽象的对象集合
          • 如果没有非泛型字典,您将如何高效轻松地存储例如JSON 数据,充满 Dictionary/Hashtable: string-to-(int/string/bool/Dictionary/List)?在我看来,丢弃非泛型集合非常愚蠢,因为在现实世界中,大多数数据本质上是非类型化的,我们需要非泛型 C 之类的工具来帮助我们轻松地提取、解析、转换、验证等...不是吗?
          • 嗯,10 年后,非泛型集合仍然存在,所以我想说微软采取了同样的立场。根据公认的答案,非泛型比 Silverlight 和 Live Mesh 存活的时间更长!
          • 我认为这个理由站不住脚。
          【解决方案9】:

          是的,据我了解,它们只是为了与现有产品兼容。您应该始终使用类型安全的版本(即使用 System.Collections.Generic 而不是 System.Collections)。

          http://msdn.microsoft.com/en-us/library/ms379564.aspx

          【讨论】:

            猜你喜欢
            • 2021-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-24
            • 1970-01-01
            • 2016-07-26
            相关资源
            最近更新 更多