C# 编译器为哪些集合类型生成集合 类?
For what collection types does the C# compiler generate collection classes?
The documentation 对于 List<T>
状态:
If a value type is used for type T
, the compiler generates an implementation of the List<T>
class specifically for that value type. That means a list element of a List<T>
object does not have to be boxed before the element can be used...
评论中提出了一个问题,关于这里的“编译器”到底指的是什么。这与问题无关,问题是关于“编译器”(无论这意味着什么)还有什么作用。
任何其他集合类型也是如此吗?如果它只是 List<T>
,即使当 Queue<T>
等其他集合更好地表达您的意图时,始终对值类型使用 List<T>
是否是一种好习惯?
简答:使用最能表达您意图的泛型类型。 Queue<T>
就可以了,例如,如果你想表示一个队列。
更长的答案:老实说:该文档含糊不清。当它提到“编译器”时,它不是在谈论 C#(构建时)编译器(它将 C# 翻译成 IL),而是在谈论 JIT(运行时)编译器,它将 IL 翻译成 CPU 指令(适合您的特定 CPU 和环境)。
它在这里使用的特性只是泛型的一个特性,它同样适用于任何泛型用法;它不特定于 List<T>
- 相同的想法适用于任何 <T>
类型(或多泛型参数类型),包括数组。
文档也...有点模糊和不精确。细节 对大多数人来说可能并不重要 ,但它并不是真的按 T 做这件事;或者至少,不是所有的 T。每个值类型 T(或涉及值类型的排列,对于多泛型参数场景)都会得到定制的 JIT,但所有引用类型 T share 单个实现。这与以下事实相关:只有值类型的用法涉及装箱,并且装箱是按 T 进行的;对于引用类型的用法,类型检查就足够了。甚至对于值类型的场景,通常也可以通过“约束”调用来避免框步骤。
如果我想大方一点:该文档可能试图以一种对某些人可能有意义的方式与非通用集合(你不应该在 %current year% 中使用)进行对比更熟悉.NET 1.1;在这样做的过程中,他们...远非精确。
The documentation 对于 List<T>
状态:
If a value type is used for type
T
, the compiler generates an implementation of theList<T>
class specifically for that value type. That means a list element of aList<T>
object does not have to be boxed before the element can be used...
评论中提出了一个问题,关于这里的“编译器”到底指的是什么。这与问题无关,问题是关于“编译器”(无论这意味着什么)还有什么作用。
任何其他集合类型也是如此吗?如果它只是 List<T>
,即使当 Queue<T>
等其他集合更好地表达您的意图时,始终对值类型使用 List<T>
是否是一种好习惯?
简答:使用最能表达您意图的泛型类型。 Queue<T>
就可以了,例如,如果你想表示一个队列。
更长的答案:老实说:该文档含糊不清。当它提到“编译器”时,它不是在谈论 C#(构建时)编译器(它将 C# 翻译成 IL),而是在谈论 JIT(运行时)编译器,它将 IL 翻译成 CPU 指令(适合您的特定 CPU 和环境)。
它在这里使用的特性只是泛型的一个特性,它同样适用于任何泛型用法;它不特定于 List<T>
- 相同的想法适用于任何 <T>
类型(或多泛型参数类型),包括数组。
文档也...有点模糊和不精确。细节 对大多数人来说可能并不重要 ,但它并不是真的按 T 做这件事;或者至少,不是所有的 T。每个值类型 T(或涉及值类型的排列,对于多泛型参数场景)都会得到定制的 JIT,但所有引用类型 T share 单个实现。这与以下事实相关:只有值类型的用法涉及装箱,并且装箱是按 T 进行的;对于引用类型的用法,类型检查就足够了。甚至对于值类型的场景,通常也可以通过“约束”调用来避免框步骤。
如果我想大方一点:该文档可能试图以一种对某些人可能有意义的方式与非通用集合(你不应该在 %current year% 中使用)进行对比更熟悉.NET 1.1;在这样做的过程中,他们...远非精确。