连接多个字符串与String.Format

这里有两种方法相同:

public class MessageManager { public void SendMessage(string name, int count) { string message = "Hi " + name + ". I know you don't like cake, so I bought you " + count + " lollipops. Same thing, right?"; // No boxing. "count" was converted to string somehow. //Console.WriteLine(message); } public void SendMessage2(string name, int count) { string message = String.Format("Hi {0}. I know you don't like cake, so I bought you {1} lollipops. Same thing, right?", name, count); // Boxing "name" and "count" + executing unnecessary code. //Console.WriteLine(message); } } 

所以我猜第二种方法会比第一种方法慢,因为装箱并执行String.Format()方法中的一些额外代码。

我用以下方法测试了它们:

 public static class PerformanceTester { public static TimeSpan TestAction(Action action) { Stopwatch timer = new Stopwatch(); timer.Start(); for (ushort i = 0; i < ushort.MaxValue; i++) action("Alex", 1000); timer.Stop(); return timer.Elapsed; } } 

以下是它的用法:

  static void Main(string[] args) { MessageManager mm = new MessageManager(); TimeSpan ts_m1 = PerformanceTester.TestAction(new Action(mm.SendMessage)); TimeSpan ts_m2 = PerformanceTester.TestAction(new Action(mm.SendMessage2)); Console.WriteLine("First message took time: " + ts_m1.ToString()); Console.WriteLine("Second message took time: " + ts_m2.ToString()); Console.ReadKey(); } 

使用我的英特尔®酷睿™2双核处理器E8200(DEBUG)输出:

string_test

使用我的英特尔®酷睿™2双核处理器E8200(RELEASE)输出: 在此处输入图像描述

我看到几乎所有地方都使用了String.Format(指南,博客,教程等),但它实际上比简单的字符串连接慢。 我知道当我谈论C#时我不应该关心性能,但是这个例子中的结果太棒了。 问题是 :“有没有最好的做法,其中String.Format实际上比串联串联更好。”

这主要是风格问题。 但是,请考虑更复杂的格式。 例如,你想格式化一堆东西:

 var s = String.Format("{0,10:N2} {1,-20} {2:P2}", val, description, (val/100)); 

要么 …

 var s = val.ToString("10:N2") + string.Format("{0,-20}", desc) + (val/100).ToString("P2"); 

我更喜欢那里的String.Format调用。 它将格式与内容分开,就像CSS将表示与HTML内容分开一样。 当我编写或检查格式化输出的代码时,我通常希望一目了然地看到格式。 在调试格式问题时,格式化的实际值不相关。

通过连接,我不得不通过单个值来查看每个项目的格式。

最后,性能真的很重要吗? 大多数程序花费很少的时间格式化他们的输出 优化格式代码似乎是浪费时间。 写下任何更容易维护和certificate正确的内容。

string.format是格式化字符串的名称。 你可以采用格式字符串并将其粘贴在资源中或进行翻译。 它与性能无关,与可读性无关。 简单的字符串连接是可以的,如果你想说小于5.如果你想连接更多的字符串并想要考虑性能 – 使用StringBuilder。