分享
三行代码  ›  专栏  ›  技术社区  ›  yuxing

为什么装箱出现在int的插值表达式中?

  •  0
  • yuxing  · 技术社区  · 1 周前

    例如,以下代码:

    int n=1;
    string str=$"{n}";
    

    ToString() 显然,拳击不会发生。

    int n=1;
    //The compiler will recommend removing the explicit call of the ToString() method
    string str=$"{n.ToString()}";
    

    这本书 CLR via C# String.Format 将调用 ToString

    既然ToString方法是在内部调用的,为什么在示例1中会出现装箱?

    3 回复  |  直到 1 周前
        1
  •  1
  •   Sweeper    1 周前

    “召唤 ToString 托斯林

    如您所知,字符串插值通常会去糖 string.Format list of overloads available ,您将看到不存在一个重载,该重载的值类型为 int long . 每次超载都需要 object 内景 在这些方法中,首先需要对其进行装箱。 字符串格式 托斯林 在某个时刻 对象 .

    把这个和直接打电话比较一下 在字符串插值中。没有到引用类型的转换( 对象

        2
  •  2
  •   Dai    1 周前

    我注意到,尽管您的代码使用的是一个C#内插字符串,但它没有使用 FormattedString 类作为C编译器只使用 格式化字符串 如果插值字符串直接指定给 格式化字符串

    CLR via C这本书写道字符串格式将在内部调用ToString方法以获取对象的字符串表示形式。

    是的,但是 String.Format 重载使用 Object params Object[] ,这必然意味着对其参数进行装箱。

    因为它必须过去 int n Object arg0 .

    IL_0000:  ldc.i4.1    
    IL_0001:  stloc.0     
    IL_0002:  ldstr       "{0}"
    IL_0007:  ldloc.0     
    IL_0008:  box         System.Int32
    IL_000D:  call        System.String.Format
    IL_0012:  pop         
    IL_0013:  ret   
    

    box IL_0008 ,就在它进入 字符串格式

        3
  •  0
  •   insane_developer    1 周前