使用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
为什么编译器要这样做?它不能。
如果传入一个对象(在本例中为盒装的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
之前检查它。