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

Mic*_*ker 10 .net c# generics reification

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

List<int> list = new List<int>();
list.Add(1);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 20

不,它不会被装箱.在执行时,List<int>遗嘱的支持数组真的是一个int[].请注意,这不仅仅是真正原始类型的情况 - List<T>不会对任何值类型的框值(假设它已被声明为List<Guid>等而不是List<object>).

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

例如,如果你写:

object list = new List<string>();
Type type = list.GetType();
Run Code Online (Sandbox Code Playgroud)

然后type将等于typeof(List<string>)- 然后与(比如说)List<Guid>等不同.


Fre*_*örk 5

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


Eri*_*ert 5

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

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