我正在读拳击和string.format()
。而且我了解到它会封装一个值类型,例如整数。
因此以下代码将导致装箱
var number = 5;
var sampleString = string.Format("The number 5: {0}", number);
此代码将生成字符串
The number 5: 5
但是,如果我使用标准+
运算符连接,它仍会生成相同的字符串。
var sampleString = "The number 5: " + number;
这里发生了什么,这也是将整数转换为对象吗?
这也适用于日期对象,例如
var dateString = string.Format("The date: {0}", DateTime.Now);
var dateString = "The date: " + DateTime.Now;
我想第一行会打包,但第二行也不会?
答案 0 :(得分:4)
对于:var dateString = "The date: " + DateTime.Now;
+
将转换为String.Concat
来电,在您的代码中,它会调用string.Concat(object,object)
超载。这将导致值类型DateTime.Now
的装箱对象。
查看生成的IL。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 55 (0x37)
.maxstack 2
.locals init ([0] string dateString0,
[1] string dateString1)
IL_0000: ldstr "The date: {0}"
IL_0005: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
IL_000a: box [mscorlib]System.DateTime
IL_000f: call string [mscorlib]System.String::Format(string,
object)
IL_0014: stloc.0
IL_0015: ldstr "The date: "
IL_001a: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
IL_001f: box [mscorlib]System.DateTime
IL_0024: call string [mscorlib]System.String::Concat(object,
object)
IL_0029: stloc.1
IL_002a: ldloc.0
IL_002b: call void [mscorlib]System.Console::WriteLine(string)
IL_0030: ldloc.1
IL_0031: call void [mscorlib]System.Console::WriteLine(string)
IL_0036: ret
} // end of method Program::Main
正如您在IL中看到的,字符串连接转换为对
的调用 IL_0024: call string [mscorlib]System.String::Concat(object,
object)
这是生成IL的代码
static void Main(string[] args)
{
var dateString0 = string.Format("The date: {0}", DateTime.Now);
var dateString1 = "The date: " + DateTime.Now;
Console.WriteLine(dateString0);
Console.WriteLine(dateString1);
}
如果String.Format
拳击也会发生。