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

Mad*_* D. 1 .net c#

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

 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
 string Url = @"http://www." + Url +@"/"+ ext +@"/"+  sub  + subSub;
Run Code Online (Sandbox Code Playgroud)

不是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);
Run Code Online (Sandbox Code Playgroud)

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

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

 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();
Run Code Online (Sandbox Code Playgroud)

是那个更有效的呢?

SLa*_*aks 8

你的同事完全错了.

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

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

编辑 :( String.Concat这相当于+连接,就像你的第一个例子)是最快的方法.在编辑中使用StringBuilder会比较慢,因为在每次Replace调用期间需要调整字符串的大小.


Han*_*ant 8

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

Url = Url.Replace("#URL", url);
Url = Url.Replace("... etc");
Run Code Online (Sandbox Code Playgroud)

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

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

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

快速可读性.

  • 使用StringBuilder*不会*使串联更有效.它是一个单独的表达式 - 编译器将对String.Concat进行一次调用. (7认同)

Fyo*_*kin 5

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

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

Url = Url.Replace("#URL",url)
Url = Url.Replace("#EXT",ext);
Url = Url.Replace("#sub",sub);
Url = Url.Replace("#subSub",subSub);
Run Code Online (Sandbox Code Playgroud)

这样的事情的首选方法是使用string.Format:

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

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

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