使用String. concat (Object)代替String. concat (String)的目的

本文关键字:String concat Object 使用 代替 | 更新日期: 2023-09-27 18:05:46

在c#中使用String.Concat(Object)而不是String.Concat(String)的目的是什么?为什么不使用隐式调用Object.ToString()而不是传递object本身,这也可能导致拳击发生?

Int32 i = 5;
String s = "i = ";
// Boxing happens, ToString() is called inside
Console.WriteLine(s + i);
// Why compiler doesn't call ToString() implicitly?
Console.WriteLine(s + i.ToString());

给出如下IL。

.method private hidebysig static void  MyDemo() cil managed
{
    // Code size       47 (0x2f)
    .maxstack  2
    .locals init ([0] int32 i, [1] string s)
    IL_0000:  nop
    IL_0001:  ldc.i4.5
    IL_0002:  stloc.0
    IL_0003:  ldstr      "i = "
    IL_0008:  stloc.1
    IL_0009:  ldloc.1
    IL_000a:  ldloc.0
    IL_000b:  box        [mscorlib]System.Int32
    IL_0010:  call       string [mscorlib]System.String::Concat(object, object)
    IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_001a:  nop
    IL_001b:  ldloc.1
    IL_001c:  ldloca.s   i
    IL_001e:  call       instance string [mscorlib]System.Int32::ToString()
    IL_0023:  call       string [mscorlib]System.String::Concat(string, string)
    IL_0028:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_002d:  nop
    IL_002e:  ret
} // end of method Program::MyDemo

使用String. concat (Object)代替String. concat (String)的目的

为什么编译器要这样做?它不能。

如果传入一个对象(在本例中为盒装的int),编译器唯一的可能是调用string.Concat(object, object)。它不能调用string.Concat(string, string),因为不是两个参数都是string,因此服从第二个重载。

相反,它调用string.Concat(object, object),并在适用的情况下在内部执行ToString

作为开发人员,您对string.Concat方法的工作原理有深入的了解。编译器不知道最终它们都变成了string .

同样,如果object s中的一个是null,会发生什么?ToString将异常失败。这说不通啊。只需传入object,让代码处理它。

参考来源:http://referencesource.microsoft.com/mscorlib/系统/string.cs, 8281103 e6f23cb5c

显示:

    public static String Concat(Object arg0) {
        Contract.Ensures(Contract.Result<String>() != null);
        Contract.EndContractBlock();
        if (arg0 == null)
        {
            return String.Empty;
        }
        return arg0.ToString();
    }

它只是简单地创建该对象的字符串表示形式。所以你传递的任何对象都被转换成String。如果为空,则为String.Empty。我认为这也节省了我们在将"null"对象转换为string之前检查它。