【发布时间】:2010-03-05 20:35:59
【问题描述】:
我不是在寻找如何,我在寻找为什么?我找不到一个直接的答案。
【问题讨论】:
标签: c# .net generics collections
我不是在寻找如何,我在寻找为什么?我找不到一个直接的答案。
【问题讨论】:
标签: c# .net generics collections
是的。 CollectionBase 是以前的尝试,也是一种提供类型安全的方法。
泛型为您提供了这些优势,但还增加了两个巨大的优势:
编辑:
我想到了其他几个令人信服的理由来让您的代码使用泛型集合:
Cast<T>(CollectionBase 未实现 IEnumerable<T>,仅实现 IEnumerable)。【讨论】:
只需键入 <type> 即可对所有不同类型的集合进行强类型访问?
编辑: 如果您要删除现有的和工作的代码,唯一的原因是其他地方提到的性能。
【讨论】:
类型安全,无需为每种类型编写大量代码。如果您查看MSDN CollectionBase documentation 中的示例,您必须编写大量样板代码来创建 Int16 的类型安全集合。使用泛型会更短一些:
var myListofInt16 = new List<Int16>();
您不必编写的每一段代码都是不会出错的代码(我这么说是因为它适用于我,我相信它也适用于其他人! ;-)
【讨论】:
使用 CollectionBase,您需要进行扩展以提供泛型本机执行的功能。您必须编写所有管道以说明您从中创建的子类中的类型安全。使用泛型就没有必要了。您需要转换为泛型吗?这取决于你的情况,但我不会继续使用它。
另外,使用泛型而不是集合基可以为您提供写入 .net 的所有扩展方法,从而使常见任务更容易。 MS 正在推动使用仿制药,并积极开发它们的采用。他们很可能会继续开发他们的功能。
【讨论】:
您想使用泛型来避免装箱。
这是一个很好的article 列出泛型的好处。
【讨论】:
还有一个原因。
LINQ。
您只能对实现 IEnumerable<T> 的集合使用 LINQ 方法。
要在 CollectionBase 上使用 LINQ,您必须先调用 Cast<T>,或者在类上手动实现 IEnumerable<T>。
通过从ObjectModel.Collection<T> 继承,您可以免费获得IEnumerable<T> 实现。
【讨论】: