你什么时候不使用通用收藏?

时间:2009-03-31 09:01:17

标签: c# .net generics

使用泛型的优点是它增加了类型的安全性 - 你只能放入正确类型的东西,并且你可以在不需要演员的情况下获得正确的类型。我不能使用泛型集合的唯一原因是你需要存储一些任意数据。我错过了什么吗?在处理集合时还有哪些其他原因不使用泛型?

8 个答案:

答案 0 :(得分:14)

如果您需要存储任意数据,请使用List<object>(或其他)。然后它绝对清楚,它是故意任意。

除此之外,我不会将非泛型集合用于任何事情。当我转换IEnumerable引用并且不知道在编译时将其强制转换的类型时, 使用了IListobject所以非泛型接口有时很有用......但不是非泛型类本身。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

带有泛型的

Type variance会让你失望,但大多数情况下你使用泛型集合。没有一个真正的理由可以避免它们,以及世界上所有避免像ArrayList这样的非类型集合的原因。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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