[英]How does C# generics affect collections with primitives
据我了解,C#/ .Net泛型支持某种程度的具体化。 所以,如果我有以下代码:
List<int> list = new List<int>();
list.Add(1);
值1是自动装箱还是'list'对象会有效地处理原始int?
不,它不会被装箱。 在执行时, List<int>
的后备数组将真正是一个int[]
。 请注意,这不仅仅是真正原始类型的情况 - List<T>
不会对任何值类型的框值(假设它已被声明为List<Guid>
etc而不是List<object>
)。
基本上,.NET中的泛型比Java中更多地保留了他们的信息--CLR本身理解泛型并适当地处理它们,而不是在Java中,JVM几乎不了解它们。
例如,如果你写:
object list = new List<string>();
Type type = list.GetType();
然后type
将等于typeof(List<string>)
- 然后它与(例如) List<Guid>
等不同。
int
值不会在列表中装箱。 这是泛型的美女之一,编译器(更确切地说是JIT编译器,我相信)将构造List<>
类的类型化版本 ,而不是将值存储为object
。 因此,它不仅通过暴露的方法和属性强制实施类型安全,而且它在所有方面都是真正的类型。
正如其他人所指出的那样,抖动会为涉及新值类型的每个构造生成新代码。 到目前为止尚未提及的一个有趣的观点是,抖动将为参考类型构造生成一次代码,并为每种引用类型重新使用该代码。 List<object>
的代码与List<string>
的代码完全相同。
这可能听起来很疯狂,但请记住,泛型不是模板。 当发出泛型方法体IL的代码时,C#编译器已经完成了重载解析和其他相关的语义分析。
.NET泛型正在专门针对结构,因此在您的情况下不需要装箱。 请注意,无论如何都不需要进行铸造。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.