4

在我早期的 .Net 编程时代,我仅将 string.Format() 用于复杂的字符串连接,例如将字符串编译为

日期为 2002 年 2 月 2 日的客户订单 234 和付款 ID 55543 存在问题。

但现在我几乎对我必须做的每一个字符串连接都使用了 string.Format,也包括简单的连接,比如在字符串前面加上一些东西。

Console.WriteLine(string.Format("\t\t{0}", myString));

这有什么可能的开销吗?也许我应该使用常规+运算符来做这些简单的操作?

您对此有何看法?

4

7 回答 7

5

对于简单的字符串连接,请使用该+方法。对于不需要格式的简单事物来说更清楚。

对于具有特定格式的更复杂的字符串,并且保留整个字符串的结构并为输入提供占位符很有用,请使用String.Format.

是的,有开销。String.Format在幕后使用 StringBuilder。在这些情况下,简单的字符串连接会快得多。可以很容易地找到有关此主题的一些基准测试和博客文章。当然,这一切都取决于您的使用情况。如果循环中出现小字符串连接,那么重复使用 ofString.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). 这仍然是一个微不足道的例子,但你明白了。

于 2010-03-19T15:13:28.903 回答
2

简单的连接对于简单的事情更有效。用于String.Format()当事情变得更复杂并且它使您的代码更易于阅读时使用。

我个人做同样的事情(只要我调用的函数不为我处理格式)。


澄清

对于像我这样的常规字符串连接,"Hello " + "World!";我会使用 StringBuilder。您的示例通过添加两个选项卡来格式化输出字符串……我认为这更像是格式化。

格式化和连接之间是有区别的......小心你使用什么。


String.Format()在内部使用 StringBuilder ,因此无论如何连接将比进行常规字符串连接更有效。

您可能想要更改您的示例,因为Console.WriteLine()可以处理格式本身(String.Format()不需要):

Console.WriteLine("\t\t{0}", myString);

于 2010-03-19T15:12:25.753 回答
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);
于 2010-03-19T15:14:44.663 回答
1

我的规则是,如果我必须多次使用+(concatenation),我将其更改为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
于 2010-03-19T15:19:19.950 回答
0

我不知道性能,有人可能会提供该数据,但我的感觉是,如果您想将格式字符串放入配置文件(或数据库字段或资源文件或其他任何内容)中,String.Format 是您的最佳选择. 这样,如果您想调整制表符的数量、切换到空格、添加分隔符等,您不必重新编译。

于 2010-03-19T15:13:35.797 回答
0

我倾向于使用String.Concat而不是String.Format只需要为给定字符串添加前缀或后缀。我更喜欢显式调用该Concat方法,然后使用+运算符,如果您已经在使用String.Format它,只需切换一次按键即可。

IIRC,该String.Concat方法将与使用运算符相同,因此它也比String.Format.

于 2010-03-19T15:17:10.507 回答
0

我几乎总是使用格式,尽管我使用扩展方法而不是静态字符串方法。我发现它更容易理解,更容易改变,而且通常更容易维护。它还可以使本地化更容易,因为它不会像连接那样引入排序问题。

老实说,哪个更好看?

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
于 2010-03-19T15:49:12.797 回答