【问题标题】:When would you not use Generic Collections?什么时候不使用通用集合?
【发布时间】:2017-01-25 16:36:24
【问题描述】:

使用泛型的好处是它增加了类型安全性——你只能放入正确类型的东西,并且你可以得到正确的类型而不需要强制转换。我能想到的不使用泛型集合的唯一原因是您需要存储一些任意数据。我错过了什么吗?在处理集合时,还有哪些不使用泛型的其他原因?

【问题讨论】:

  • 我将 'container' 切换为 'collection' 因为它们在 C# 中是这样引用的。
  • 这里有很多好的答案,谢谢大家

标签: c# .net generics


【解决方案1】:

如果您需要存储任意数据,请使用List<object>(或其他)。那么很明显这是故意任意的。

除此之外,我不会将非泛型集合用于任何事情。当我一直在转换 object 引用并且不知道在编译时将其转换为的类型时,我 使用了 IEnumerableIList - 所以非泛型 接口有时很有用……但非泛型类本身就不行。

【讨论】:

    【解决方案2】:

    另一个明显的原因是使用不使用泛型集合的代码(可能是遗留代码)。

    您可以在 .NET 本身中看到这种情况。 System.Windows.Form.Control.Controls 不是通用的,System.Web.UI.Control.Controls 也不是。

    【讨论】:

      【解决方案3】:

      泛型几乎总是适合使用。请注意,像 Haskell 和 ML 这样的语言基本上允许该模型:在这些语言中根本没有默认的“object”或“void*”。

      我可能不使用泛型的唯一原因是:

      1. 当适当的类型在编译时根本不知道时。诸如反序列化对象或通过反射实例化对象之类的事情。

      2. 当使用我的代码的用户不熟悉他们时(还)。并非所有工程师都喜欢使用它们,尤其是在一些更高级的模式中,例如 CRTP

      【讨论】:

        【解决方案4】:

        主要优点是对值类型的通用集合没有装箱或拆箱惩罚。如果您使用 ildasm.exe 检查 il,则可以看到这一点。泛型容器为值类型提供更好的性能,而为引用类型提供较小的性能提升。

        【讨论】:

          【解决方案5】:

          Type variance 使用泛型可能会绊倒你,但大多数情况下你应该使用泛型集合。没有一个很好的理由来避免它们,而世界上所有的理由都应该避免像 ArrayList 这样的无类型集合。

          【讨论】:

            【解决方案6】:

            这是一个答案:The change from Hashtable to Dictionary

            【讨论】:

              【解决方案7】:

              我认为您需要考虑的一件事是,泛型集合并不总是替代非泛型集合。例如,Dictionary 可以简单地插入 Hashtable 的实例。它们在可能并且将会破坏程序的许多场景中具有非常不同的行为。在这两个集合之间切换会迫使优秀的程序员检查用例以确保差异不会影响它们。

              【讨论】:

              • 你能举个例子吗?我想不出 hashtable 和 dictionary 不能互换的任何原因。 (显然减去一些语法变化)
              • 其实最经典的例子就是找不到item时的行为。 HashTable 返回 null 而字典抛出异常
              • 人力资源管理。这当然是真的,但 id 仍然将其视为语法问题。如果不包含密钥,则返回 null 的简单扩展方法将使您回到散列功能
              【解决方案8】:

              Microsoft.VisualBasic 命名空间中的非泛型 Collection 有一些烦人的怪癖和愚蠢,在很多方面都非常可怕,但它也有一个独特的特点:它是唯一表现出合理语义的集合如果在枚举期间被修改;如果使用某些其他集合类型,则可能需要大量重写满足某个谓词的集合的所有成员之类的代码。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-09-13
                • 1970-01-01
                • 2019-02-28
                • 2019-08-25
                • 1970-01-01
                • 2022-11-10
                相关资源
                最近更新 更多