为什么我应该用泛型替换 CollectionBase?

发布于 2024-08-23 19:45:53 字数 37 浏览 1 评论 0原文

我不是在寻找如何,而是在寻找为什么?我找不到对此的直接答案。

I'm not looking for how, I'm looking for why? I couldn't find a straight forward answer to this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

凉世弥音 2024-08-30 19:45:53

是的。 CollectionBase 是之前的尝试,也是提供类型安全的一种方法。

泛型为您提供了这些优势,但还增加了两个巨大的优势:

  1. 使用泛型,您不再需要在每次访问集合时都进行装箱和拆箱。这提供了巨大的性能。优势。
  2. 通过泛型,您可以对所有类型使用单一实现。对于 CollectionBase,每种类型都需要自定义实现,这会导致大量重复代码(即:潜在的错误)。

编辑:

我想到了将代码转移到使用泛型集合的其他几个令人信服的理由:

  1. 使用泛型集合将允许您直接在集合上使用 LINQ to Objects,而不需要调用 Cast (CollectionBase 未实现 IEnumerable,仅实现 IEnumerable)。
  2. 提供与任何代码的一致性,这应该始终使用新的通用集合来完成。

Yes. CollectionBase was a previous attempt, and a way to provide type safety.

Generics give you these advantages, but add two more HUGE advantages:

  1. With generics, you no longer have boxing and unboxing at every access to your collection. This provides a huge perf. advantage.
  2. With generics, you can use a single implementation for all of your types. With CollectionBase, each type required a custom implementation, which leads to a huge amount of duplicated code (ie: potential for bugs).

Edit:

I thought of a couple of other compelling reasons to move your code to using generic collections:

  1. Using generic collections will allow you to directly use LINQ to Objects on your collections, without requiring calls to Cast<T> (CollectionBase does not implement IEnumerable<T>, only IEnumerable).
  2. Provide consistency with any new code, which should always be done using the new generic collections.
陌路黄昏 2024-08-30 19:45:53

只需键入 即可对所有不同类型的集合进行强类型访问?

编辑:
如果您要删除现有的和工作的代码,唯一的原因是性能,如其他地方提到的。

Strongly typed access to all the different kinds of collections at the cost of only typing <type>?

EDIT:
If you are removing existing and working code, the only reason would be for performance as mentioned elsewhere.

谁对谁错谁最难过 2024-08-30 19:45:53

类型安全,无需为每种类型编写大量代码。如果您查看 MSDN CollectionBase 文档,您必须编写大量样板代码才能创建类型安全的 Int16 集合。使用泛型,它会稍微短一些:

var myListofInt16 = new List<Int16>();

您不必编写的每一点代码都是不会出错的代码(我这么说是因为它适用于我,我确信它也适用于其他人也一样!

Type safety without having to write a lot of code per-type. If you look at the example in the MSDN CollectionBase documentation, you have to write a lot of boiler-plate code to make a typesafe collection of Int16. With generics it's somewhat shorter:

var myListofInt16 = new List<Int16>();

Every bit of code you don't have to write is code that you won't get wrong (I say that because it applies to me, I'm sure it applies to others too! ;-)

千秋岁 2024-08-30 19:45:53

对于 CollectionBase,您需要进行扩展以提供泛型本身具有的功能。您必须编写所有管道以考虑您从其创建的子类中的类型安全性。使用泛型就没有必要了。您需要转换为泛型吗?这取决于您的情况,但我以后不会使用它。

另外,使用泛型而不是集合库可以让您将所有扩展方法写入 .net 中,从而使常见任务变得更容易。 MS 正在推动仿制药的使用,并积极开发仿制药的采用。他们很可能会继续开发其功能。

With CollectionBase you need to extend to provide the functionality that generics do natively. You have to write in all the plumbing to account for type safety in sub classes that you create from it. With generics there is no need to. Do you need to convert to generics? That depends on your situation, but I wouldn't use it going forward.

Plus, using generics instead of collection base gives you all the extension methods written into .net to make common tasks easier. MS is pushing the use of generics and has actively developed their adoption. They will most likely continue to develop their functionality.

秋意浓 2024-08-30 19:45:53

您想使用泛型来避免装箱。

这是一篇很好的文章,列出了好处泛型。

You want to use Generics to avoid boxing.

This is a good article listing the Benefits of Generics.

素手挽清风 2024-08-30 19:45:53

还有另一个原因。

LINQ。

您只能在实现 IEnumerable 的集合上使用 LINQ 方法。
要在 CollectionBase 上使用 LINQ,您必须先调用 Cast,或者在类上手动实现 IEnumerable。< br>
通过继承 ObjectModel.Collection,您可以免费获得 IEnumerable 实现。

There's another reason.

LINQ.

You can only use LINQ methods on a collection that implements IEnumerable<T>.
To use LINQ on a CollectionBase, you must either call Cast<T> first, or manually implement IEnumerable<T> on the class.
By inheriting from ObjectModel.Collection<T>, you get an IEnumerable<T> implementation for free.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文