使用String + string + string vs使用string.replace

时间:2010-04-25 14:33:18

标签: c# .net

一位同事告诉我,使用以下方法:

 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
 string Url = @"http://www." + Url +@"/"+ ext +@"/"+  sub  + subSub;

不是efficenet(需要更多资源),最好使用以下方法:

 string Url = @"http://www.#URL.#EXT/#sub/#subSub";
 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
 Url = Url.Replace("#URL",url)
 Url = Url.Replace("#EXT",ext);
 Url = Url.Replace("#sub",sub);
 Url = Url.Replace("#subSub",subSub);

这是真的吗?它背后的解释是什么?

我读了这篇 Answer ,让我想知道这个案子是怎么回事:

 string Url = @"http://www.#URL.#EXT/#sub/#subSub";
 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
string finalUrl = new StringBuilder(Url )
        .Replace("#URL", "URL")
        .Replace("#EXT", "EXT")
        .Replace("#sub", "sub")
        .Replace("#subSub", "subSub")
        .ToString();

那是更多的效率吗?

7 个答案:

答案 0 :(得分:8)

你的同事完全错误。

他错误地应用了字符串是不可变的这一事实,并且附加两个字符串将创建第三个字符串对象。
您的方法(a + b + c)是最有效的方法。
编译器将您的代码转换为对String.Concat(string[])的调用,该调用使用不安全的代码为所有字符串分配单个缓冲区并将它们复制到缓冲区中。

他的建议应该是在循环中连接字符串时使用StringBuilder。

编辑String.Concat(相当于+连接,就像您的第一个示例一样)是执行此操作的最快方法。在编辑中使用StringBuilder会比较慢,因为在每次Replace调用期间需要调整字符串的大小。

答案 1 :(得分:8)

事实并非如此,因为代码错误而无法看到它。它应该是:

Url = Url.Replace("#URL", url);
Url = Url.Replace("... etc");

通常可以使用StringBuilder使字符串连接更有效。但是,如果能够准确猜出所需的容量,那么只能用这么少的字符串做得更好。但是,您的特定代码会被编译器优化为带有多个字符串的String.Concat()的重载。它使用内部高速连接器,不可能用StringBuilder击败。

利用String.Format中提供的复合格式化功能:

string Url = string.Format(@"http://www.{0}/{1}/{2}{3}", url, ext, sub, subSub);

快速可读。

答案 2 :(得分:5)

首先,我几乎可以肯定,替换并不比连接更有效。如果有的话,它可能效率更低。

其次,你的代码实际上不会像你期望的那样工作。 Replace方法不会更改字符串。 (顺便说一下,字符串不能改变;永远) 相反,Replace方法返回一个新字符串。旧的保持不变。因此,为了使它起作用,你应该写:

Url = Url.Replace("#URL",url)
Url = Url.Replace("#EXT",ext);
Url = Url.Replace("#sub",sub);
Url = Url.Replace("#subSub",subSub);

此类内容的首选方法是使用string.Format

Url = string.Format( "http://www.{0}.{1}/{2}/{3}", url, ext, sub, subSub );

但是,对于像你这样的小案例(我会说不到10个连接),使用连接实际上是最有效的。

最后,如果你有很多连接(几十个),你应该使用StringBuilder

答案 3 :(得分:4)

你的同事不对。每次调用时,Replace()方法(或“修改”字符串的任何方法)都会创建一个新字符串。因此,调用它四次会产生比生成输出所需的三个字符串。您的第一个方法只创建一个输出字符串(不包括构成网址组件的字符串)。

答案 4 :(得分:4)

只有五个字符串,在性能方面并不重要。使用简单连接,string.Format()Url.Replace()无论最佳显示您正在做什么的意图。这比不太可行的微观优化重要得多。

请记住,如果要连接多个字符串,最好使用StringBuilder类,否则会产生大量字符串,性能会受到影响。

我个人会在你的情况下使用string.Format(更简洁,全部在一行,显示意图):

string Url = string.Format("http://www.{0}/{1}/{2}{3}", url, ext, sub, subSub);

答案 5 :(得分:1)

其他人指出你的同事正在抽烟。我想解释为什么他似乎感到困惑(但不完全是100%错误的):

此代码效率很高:

string url = "SomeURL";
string ext = "SomeExt";
string sub = "SomeSub";
string subSub = "moreSub";
string Url = @"http://www." + Url +@"/"+ ext +@"/"+  sub  + subSub;

它很有效,因为只有一个连接发生(多个字符串)。

另一方面,如果你用以下方式编写它,那将非常效率低下

// BAD CODE!  Don't write this.
string url = "http://www.";
url += "SomeURL";
url += "/";
url += "SomeExt";
url += "/";
url += "SomeSub";
url += "moreSub";

上面的代码必须为每个连接分配一个新字符串。如果你在几行代码上执行此操作,那并不可怕,只是糟糕。如果你在一个紧凑的循环内完成它,它就是一个性能杀手。

如果您将第二个版本的代码与使用string.Format的版本进行比较:

string url = string.Format("http://www.{0}/{1}/{2}{3}",
    "SomeURL", "SomeExt", "SomeSub", "moreSub");

然后在案例中,string.Format string.Replace)版本将更多更快,因为它只需要构造一个字符串。

所以关于string.Format是否比连接更有效的答案取决于如何进行连接如何进行格式化。 A单个连接(可以连接多个字符串,正如我之前解释的那样)远远快于Format。但是,一系列顺序连接将比单个Format慢。

换句话说,如果你把前者弄得一团糟,那么连接比Format(不是Replace)要慢。

答案 6 :(得分:-2)

因为当你使用“+”时,你正在创建一个新对象 所以它不是ecicenet