C# 整数与字符串拼接之间的装箱操作

       值类型与引用类型之间的转换存在装箱与拆箱操作,将值类型转换成引用类型的操作叫装箱,将引用类型转换成值类型叫拆箱。
       除了显式的转换之外,在方法调用存在隐式转换也有装箱与拆箱操作,例如:Console.Write()方法的参数是整数类型,将Int转换成Object。注:在整数类型与字符串类型操作时,是否会默认调用ToString()方法有待于确认。
       经编码测试,整数类型在与字符串进行拼接操作时,并不默认调用ToString()方法,存在装箱操作。例如如下代码:
Console.WriteLine(5 + "afasdf");
经IL反编译下的IL代码如下:
  IL_0001:  ldc.i4.5
  IL_0002:    box         [mscorlib]System.Int32    (装箱操作,将5这个整数进行装箱)
  IL_0007:  ldstr      "afasdf"
  IL_000c:  call         string [mscorlib]System.String::Concat(object,object)
  IL_0011:  call       void [mscorlib]System.Console::WriteLine(string)
 
     普通字符串拼接代码:
string a = 5 + "dd";
     经IL反编译后的IL代码:
  IL_0001:  ldc.i4.5
  IL_0002:   box         [mscorlib]System.Int32        (也存在装箱操作)
  IL_0007:  ldstr      "dd"
  IL_000c:  call       string [mscorlib]System.String::Concat(object, object)
 
       但是直接将5输出就不会产生装箱操作,如下代码:
Console.WriteLine(5);
       经IL反编译下的IL代码如下:
  IL_0001:  ldc.i4.5
  IL_0002:  call       void [mscorlib]System.Console::WriteLine(int32)
        没有产生装箱操作。
        例外如下代码:
Console.WriteLine(5.ToString() + "dd");
        经IL反汇编下的IL代码如下:
  IL_0001:  ldc.i4.5
  IL_0002:  stloc.0
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       instance string [mscorlib]System.Int32::ToString()
  IL_000a:  ldstr      "dd"
  IL_000f:  call         string [mscorlib]System.String::Concat(string,string)
  IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
        注意到调用的字符串连接函数的参数类型不一样,这才是导致装箱操作的原因。这提示我们多显式调用ToString()方法,能避免部分装箱操作,提升性能。

转载于:https://www.cnblogs.com/LiChangPing/p/3344146.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值