我知道string.format会框住某个对象,当只是连接字符串时也是如此
本文关键字:连接 字符串 format string 对象 我知道 | 更新日期: 2023-09-27 18:26:33
我在读拳击和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;
我想第一行会装箱,但第二行不会也一样?
用于: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
的情况下,拳击也将进行。