我现在要添加一个示例来说明编译器如何处理这两者,因为在其他一些答案中似乎存在很多混淆(编辑:请注意,这些混淆中的大部分现在已被删除/编辑掉) :
bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel,
value ? "ON" : "OFF");
最后一行编译为:
String s = String.Format(":Channel{0}:Display {1}",
new object[2] {(object)channel, value ? "ON" : "OFF")};
有趣的是,创建了一个数组和一个“盒子” ,当然还有查找/int channel
所需的额外解析。{0}
{1}
现在2号:
bool value = true;
String channel = "1";
string s = ":Channel" + channel + ":Display " + (value ? "ON" : "OFF");
最后一行编译为:
string s = string.Concat(":Channel", channel, ":Display ", value ? "ON" : "OFF");
这里没有数组,没有盒子(channel
现在是一个字符串),也没有解析。过载是public static string string.Concat(string,string,string,string)
; string.Concat
非常有效地实现,预先分配一个正确大小的字符串然后覆盖,等等。
在大多数代码中,两者都可以。第二个版本在技术上更有效(没有盒子,没有数组,没有解析),但是如果你以后想国际化,那就是一个主要的痛苦。在大多数应用程序中,您不会注意到两者之间有任何区别。解析速度很快,并且盒子/数组作为 gen-zero 对象被廉价地收集。但便宜不是免费的。