【问题标题】:For what collection types does the C# compiler generate collection classes?C# 编译器为哪些集合类型生成集合类?
【发布时间】:2021-11-14 06:34:56
【问题描述】:

The documentation 代表List<T> 状态:

如果一个值类型用于类型T,编译器会专门为该值类型生成List<T> 类的实现。这意味着 List<T> 对象的列表元素不必在可以使用元素之前被装箱......

在 cmets 中提出了一个问题,即此处的“编译器”到底指的是什么。这与问题无关,即“编译器”(无论这可能意味着什么)还有什么作用。

其他任何集合类型都是这样吗?如果只有List<T>,即使像Queue<T> 这样的其他集合更好地表达了您的意图,始终将List<T> 用于值类型是否是一种好习惯?

【问题讨论】:

  • 所有采用泛型类型参数的集合类型都是如此
  • @EhsanSajjad 这是否记录在任何地方?或者其他收藏是否在内部使用List<T>
  • 我建议您始终使用最适合您需要的类型,而不用担心它们是否是值类型。所以如果你需要一个队列,使用Queue<T>
  • 正如@EhsanSajjad 所提到的,这并不特定于List<T> - this is true for any generic type definition with a type parameter that accepts value types
  • @MarcGravell 同样,这些文档中“编译器”的确切含义与我的问题完全无关。

标签: c# collections


【解决方案1】:

简短回答:使用最合适的泛型类型来表达您的意图。例如,如果你想代表一个队列,Queue<T> 就可以了。


更长的答案:老实说:文档很模糊。当它提到“编译器”时,它不是在谈论 C#(构建时)编译器(将 C# 转换为 IL),而是在谈论 JIT(运行时)编译器,它将 IL 转换为 CPU 指令(适合您的特定的 CPU 和环境)。

这里使用的特性只是泛型的一个特性,它同样适用于任何泛型用法;它并非特定于 List<T> - 同样的想法适用于任何 <T> 类型(或多泛型参数类型),包括数组。

文档也......有点毛茸茸且不精确。细节对大多数人来说可能并不重要,但它并没有真正做到这一点;或者至少,不是所有的 T。每个值类型 T(或涉及值类型的排列,对于多泛型参数场景)都有一个定制的 JIT,但是所有的引用类型 T share a单一实现。这与只有值类型使用涉及装箱这一事实有关,并且装箱是按 T 的;对于引用类型的用法,类型检查就足够了。甚至对于值类型的场景,通常可以通过“约束”调用来避免框步。


如果我想大方一点:文档可能试图与非泛型集合(您不应该在 %current year% 中真正使用)进行对比,以一种对更熟悉的人来说可能有意义的方式使用 .NET 1.1;在这样做时,它们...远非精确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多