代码之家  ›  专栏  ›  技术社区  ›  Michael Barker

C#泛型如何影响带有原语的集合

  •  10
  • Michael Barker  · 技术社区  · 14 年前

    List<int> list = new List<int>();
    list.Add(1);
    

    值1是自动装箱还是“list”对象有效地处理原语int?

    4 回复  |  直到 14 年前
        1
  •  20
  •   Jon Skeet    14 年前

    不,它不会被装箱的。在执行时 List<int> 将真正成为 int[] . 请注意,这不仅仅是真正的基元类型的情况- List<T> 任何 值类型(假设它被声明为 List<Guid> List<object> ).

    基本上,.NET中的泛型比Java中保存了更多的信息—CLR天生理解泛型并适当地处理它们,而不是在Java中JVM对它们一无所知。

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

    那么 type 将等于 typeof(List<string>) 列表<Guid> 等。

        2
  •  5
  •   Fredrik Mörk    14 年前

    这个 int 值不会在列表中装箱。这是泛型的优点之一,编译器(更具体地说,我相信是JIT编译器)将构造一个 List<> 类,而不是将值存储为 object

        3
  •  5
  •   Eric Lippert    14 年前

    正如其他人所注意到的,jitter为每个涉及新值类型的构造生成新代码。到目前为止还没有提到的一个有趣的点是抖动将生成代码 每一个 引用类型。的代码 List<object> 与的代码完全相同 List<string>

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

        4
  •  3
  •   Dario    14 年前

    .NET泛型正在变得专门用于结构,因此在您的案例中不需要装箱。请注意,无论如何也不需要铸造。

    推荐文章