C#generics如何影响具有基元的集合

据我了解,C#/ .Netgenerics支持某种程度的具体化。 所以,如果我有以下代码:

List list = new List(); list.Add(1); 

值1是自动装箱还是’list’对象会有效地处理原始int?

不,它不会被装箱。 在执行时, List的后备数组将真正是一个int[] 。 请注意,这不仅仅是真正的原始类型的情况 – List不会对任何值类型的框值(假设它已被声明为List etc而不是List )。

基本上,.NET中的generics比Java中更多地保留了他们的信息–CLR本身理解generics并适当地处理它们,而不是在Java中,JVM几乎不了解它们。

例如,如果你写:

 object list = new List(); Type type = list.GetType(); 

然后type将等于typeof(List) – 然后它与(例如) List等不同。

int值不会在列表中装箱。 这是generics的美女之一,编译器(更确切地说是JIT编译器,我相信)将构造List<>类的类型化版本 ,而不是将值存储为object 。 因此,它不仅通过暴露的方法和属性强制实施类型安全,而且它在所有方面都是真正的类型。

正如其他人所指出的那样,抖动会为涉及新值类型的每个构造生成新代码。 到目前为止尚未提到的一个有趣的观点是,抖动将为引用类型构造生成一次代码,并为每种引用类型重用该代码。 List的代码与List的代码完全相同。

这可能听起来很疯狂,但请记住,generics不是模板。 当发出generics方法体IL的代码时,C#编译器已经完成了重载解析和其他相关的语义分析。

.NETgenerics专门针对结构,因此在您的情况下不需要装箱。 请注意,无论如何都不需要进行铸造。