在我早期的.Net编程时代,我只将string.Format()用于复杂的字符串连接,例如将字符串编译为
2002年2月2日的客户订单234和付款ID 55543的问题。
但是现在我几乎每个字符串连接都使用string.Format,也就是简单的字符串连接,例如在字符串前加上东西。
Console.WriteLine(string.Format("\t\t{0}", myString));
这有可能的开销吗?也许我应该使用常规+
运算符来执行这些简单的操作?
您对此有何看法?
答案 0 :(得分:5)
对于简单的字符串连接,请使用+
方法。对于不需要格式的简单事物来说更清楚。
对于具有特定格式的更复杂字符串,以及保留整个字符串结构并为输入提供占位符有用的字符串,请使用String.Format
。
是的,有一个开销。 String.Format
在封面下使用StringBuilder。在这些情况下,简单的字符串连接会更快。可以很容易地找到关于此主题的几个基准和博客文章。当然这一切都取决于你的用法。如果在循环中发生小字符串连接,那么重复使用String.Format
可能比直接+
连续更明显。如果你在循环中构建一个大字符串,那么经典的例子是首选StringBuilder
,并且可以在SO上找到关于concat和StringBuilder的相关问题。
编辑:为了澄清,这没有用处:String.Format("{0}{1}", a, b)
因为格式不多。它只是a + b
。不幸的是,我在生产代码中遇到过这样的例子,一看到String.Format,我希望看到某些东西需要以某种方式构建,而不是简单的连接。
OTOH,请考虑这个电话号码:"(" + area + ") " + number + " x" + extension
- 有太多的事情要进行修改并不容易。在这种情况下,最好使用String.Format:String.Format("({0}) {1} x{2}", area, number, extension)
。这仍然是一个微不足道的例子,但你明白了。
答案 1 :(得分:2)
简单连接对于简单的事情更有效。使用String.Format()
可以使事情变得更复杂,并使代码更易于阅读。
我个人做同样的事情(只要我正在调用的函数不能处理我的格式化)。
<强> Clarrification 强>
对于像"Hello " + "World!";
这样的常规字符串连接,我会使用StringBuilder。您的示例通过添加两个选项卡来格式化输出字符串...我认为这更像是格式化。
格式化和连接之间存在差异...请注意您使用的内容。
String.Format()
在内部使用StringBuilder,因此连接比执行常规字符串连接更有效。
您可能希望更改示例,因为Console.WriteLine()
可以自行处理格式化(不需要String.Format()
):
Console.WriteLine("\t\t{0}", myString);
击> <击> 撞击>
答案 2 :(得分:2)
我也倾向于在大多数操作中使用string.Format,这需要组合两个或多个字符串/值,因为它比在中间用+'开始和停止字符串更容易读取代码。
展开
string value = string.Format("Hello {0}", user.username);
比
更具可读性和可扩展性string value = "Hello" + user.username
例如,如果您想将上次登录日期添加为系统升级,则只需将代码扩展为以下内容
string value = string.Format("Hello {0}, you last logged in {1}", user.username, user.lastLogin);
答案 3 :(得分:1)
我的规则是,如果我不得不多次使用+
(连接),我将其更改为string.Format
。
string a = "Something: " + x; // ok
string b = "Something: " + x + " something else"; // change it to a string.Format
string bB = string.Format("Something: {0} something else", x); // much nicer to read
string c = "Something: " + x + " " + y + " " + z; // Yuck
string cC = string.Format("Something: {0} {1} {2}", x, y, x); // Much nicer
答案 4 :(得分:0)
我不知道性能,有人可能会提供这些数据,但我的感觉是,如果你想把格式字符串放在你的配置文件(或数据库字段或资源文件)中,String.Format是要走的路管他呢)。这样,如果你想调整选项卡的数量,切换到空格,添加分隔符等等,你就不必重新编译。
答案 5 :(得分:0)
当我只需要为给定字符串添加前缀或后缀时,我倾向于使用String.Concat
而不是String.Format
。我更喜欢显式调用Concat
方法,然后使用+
运算符,如果您已经使用String.Format
,则只需切换一次击键即可。
String.Concat
方法与使用运算符相同,因此它也比String.Format
快。
答案 6 :(得分:0)
我几乎总是使用格式,虽然我使用扩展方法而不是静态字符串方法。我发现它更容易理解,更容易更改,并且通常更容易维护。它还可以使本地化更容易,因为它不会像连接一样引入排序问题。
老实说,哪个看起来更好?
"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."