C# 使用字符串+;字符串+;字符串vs使用string.replace

C# 使用字符串+;字符串+;字符串vs使用string.replace,c#,.net,C#,.net,一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string subSub = "moreSub"; string Url = @"http://www." + Url +@"/"+ ext +@"/"+ sub + subSub; string Url = @"http://www.#URL.#EXT/#sub/#subSub"; string u

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

 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
 string Url = @"http://www." + Url +@"/"+ ext +@"/"+  sub  + subSub;
 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);
不是efficenet(需要更多资源),最好使用以下方法:

 string url = "SomeURL";
 string ext = "SomeExt";
 string sub = "SomeSub";
 string subSub = "moreSub";
 string Url = @"http://www." + Url +@"/"+ ext +@"/"+  sub  + subSub;
 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);
这是真的吗?这背后的解释是什么

我读了这篇文章,不禁想知道这个案子是怎么回事:

 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();
那是不是更有效?你的同事完全错了

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

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

EDIT
String.Concat
(与第一个示例中的
+
串联等效)是执行此操作的最快方法。在编辑中使用类似的StringBuilder会更慢,因为每次替换调用时都需要调整字符串的大小。

您的同事完全错了

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

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


EDIT
String.Concat
(与第一个示例中的
+
串联等效)是执行此操作的最快方法。在编辑中使用类似的StringBuilder会更慢,因为它需要在每次替换调用期间调整字符串的大小。

您的同事不正确。Replace()方法(或任何“修改”字符串的方法)每次调用时都会创建一个新字符串。因此,调用它四次会创建比生成输出所需的字符串多三个字符串。您的第一个方法仅创建一个输出字符串(不计算构成url组件的字符串)。

您的同事不正确。Replace()方法(或任何“修改”字符串的方法)每次调用时都会创建一个新字符串。因此,调用它四次会创建比生成输出所需的字符串多三个字符串。您的第一个方法只创建一个输出字符串(不计算构成url组件的字符串)。

这不是真的,您看不到它,因为代码是错误的。应该是:

Url = Url.Replace("#URL", url);
Url = Url.Replace("... etc");
通过使用StringBuilder,通常可以提高字符串连接的效率。但是,如果您能够准确地猜测所需的容量,那么只需很少的字符串就可以做得更好。但是,编译器会将您的特定代码优化为String.Concat()重载,该重载包含多个字符串。它使用内部高速连接器,无法与StringBuilder相比

利用字符串中可用的复合格式功能。格式:

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

快速可读。

这不是真的,你看不到它,因为代码是错误的。应该是:

Url = Url.Replace("#URL", url);
Url = Url.Replace("... etc");
通过使用StringBuilder,通常可以提高字符串连接的效率。但是,如果您能够准确地猜测所需的容量,那么只需很少的字符串就可以做得更好。但是,编译器会将您的特定代码优化为String.Concat()重载,该重载包含多个字符串。它使用内部高速连接器,无法与StringBuilder相比

利用字符串中可用的复合格式功能。格式:

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

快速易读。

首先,我几乎可以肯定替换并不比串联更有效。如果说有什么区别的话,它的效率可能更低

其次,使用replace的代码实际上不会像您期望的那样工作。
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 );
string url = string.Format("http://www.{0}/{1}/{2}{3}",
    "SomeURL", "SomeExt", "SomeSub", "moreSub");
然而,在像您这样的小案例中(我想说少于10个串联),使用串联实际上是最有效的


最后,如果您有许多串联(几十个),您应该使用
StringBuilder

首先,我几乎可以肯定,替换并不比串联更有效。如果说有什么区别的话,它的效率可能更低

其次,使用replace的代码实际上不会像您期望的那样工作。
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 );
string url = string.Format("http://www.{0}/{1}/{2}{3}",
    "SomeURL", "SomeExt", "SomeSub", "moreSub");
然而,在像您这样的小案例中(我想说少于10个串联),使用串联实际上是最有效的

最后,如果有许多串联(几十个),则应使用
StringBuilder

,因为使用“+”时,您正在创建一个新对象 因此它不是efficenet,因为当您使用“+”时,您正在创建一个新对象
因此,仅对五个字符串而言,这不是efficenet,就性能而言,这并不重要。使用简单的连接,
string.Format()
Url.Replace()
任何最能显示您正在做的事情的意图的东西。这远比不太可能实现的微观优化更为重要