string.replace vs StringBuilder.replace用于内存

Aeo*_*058 8 c# stringbuilder replace

我已经将一个流下载为一个大约36MB的byte []'raw'.然后我将其转换为字符串

string temp = System.Text.Encoding.UTF8.GetString(raw)
Run Code Online (Sandbox Code Playgroud)

然后我需要用"\ r \n"替换所有"\n",所以我尝试了

 string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)

但它抛出了"内存不足"的例外.然后我尝试使用StringBuilder创建一个新字符串:

string temp2 = new StringBuilder(temp).Replace("\n","\r\n").toString()
Run Code Online (Sandbox Code Playgroud)

并没有抛出异常.为什么首先会出现内存问题(我这里只处理36MB),还有为什么StringBuilder.Replace()在另一个没有的情况下工作?

Dan*_*tja 6

当你使用:

string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)

对于字符串temp中"\n"的每个匹配,系统会使用替换创建一个新字符串.

使用StringBuilder时不会发生这种情况,因为StringBuilder是可变的,因此您实际上可以修改同一个对象而无需创建另一个对象.

例:

temp = "test1\ntest2\ntest3\n"
Run Code Online (Sandbox Code Playgroud)

使用第一种方法(字符串)

string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)

相当于

string aux1 = "test1\r\ntest2\ntest3\n"
string aux2 = "test1\r\ntest2\r\ntest3\n"
string temp2 = "test1\r\ntest2\r\ntest3\r\n"
Run Code Online (Sandbox Code Playgroud)

使用Secon方法(StringBuilder)

string temp2 = new StringBuilder(temp).Replace("\n","\r\n").toString()
Run Code Online (Sandbox Code Playgroud)

相当于

Stringbuilder aux = "test1\ntest2\ntest3\n"
aux = "test1\r\ntest2\ntest3\n"
aux = "test1\r\ntest2\r\ntest3\n"
aux = "test1\r\ntest2\r\ntest3\r\n"
string temp2 = aux.toString()
Run Code Online (Sandbox Code Playgroud)