我知道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;

我想第一行会装箱,但第二行不会也一样?

我知道string.format会框住某个对象,当只是连接字符串时也是如此

用于: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的情况下,拳击也将进行。