为什么string.Replace("X","Y")仅在分配给新字符串时有效?

Pet*_*etr 6 c# string

我想它必须做一些字符串作为参考类型,但我不知道为什么根本string.Replace("X","Y")不起作用?

我为什么要这么做string A = stringB.Replace("X","Y")?我认为这只是在指定实例上完成的方法.

编辑:谢谢你到目前为止.我提出我的问题:为什么b+="FFF"工作但b.Replace不工作?

kem*_*002 23

因为字符串是不可变的.每次更改字符串.net created都会创建一个新的字符串对象.这是班上的财产.

不可变对象
String对象


Mar*_*ers 16

为什么不起作用stringA.Replace("X","Y")
我为什么要这么做stringB = stringA.Replace("X","Y");

因为字符串在.NET中是不可变的.您无法更改现有字符串对象的值,您只能创建新字符串.string.Replace创建一个新字符串,如果您希望保留对它的引用,则可以将其分配给某个字符串.从文档:

返回一个新字符串,其中当前实例中所有出现的指定字符串都替换为另一个指定的字符串.

强调我的.


所以如果字符串是不可变的,为什么b + ="FFF"; 工作?

好问题.

首先注意b += "FFF";相当于b = b + "FFF";(除了b只评估一次).

表达式b + "FFF"创建一个具有正确结果的新字符串,而不修改旧字符串.然后分配对新字符串b的引用以替换对旧字符串的引用.如果没有对旧字符串的其他引用,那么它将有资格进行垃圾回收.


chi*_*oro 6

字符串是不可变的,这意味着一旦它们被创建,它们就不能再被更改了.这有几个原因,据我所知,主要是因为性能(如何在内存中表示字符串).

另见(在众多中):

作为直接结果,每个字符串操作都会创建一个新的字符串对象.特别是,如果你做的事情

foreach (string msg in messages)
{
    totalMessage = totalMessage + message;
    totalMessage = totalMessage + "\n";
}
Run Code Online (Sandbox Code Playgroud)

实际上,您可能会创建数十个或数百个字符串对象.因此,如果您想更复杂地操作字符串,请遵循GvS的提示并使用StringBuilder.


小智 0

String.Replace 是字符串类的共享函数,它返回一个新字符串。它不是当前对象的运算符。b.Replace("a","b") 类似于只有 c+1 的行。因此,就像 c=c+1 实际上将 c+1 的值设置为 c 一样,b=b.Replace("a","b") 将返回的新字符串设置为 b。

  • 其根本原因是因为字符串是不可变的,即它们无法更改 - 请参阅@Kevin 答案。对我来说,这是微软的一个错误,因为该方法的命名具有误导性。 (3认同)