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

时间:2010-06-01 13:07:16

标签: c# string

我想它必须做一些字符串作为引用类型,但我不明白为什么简单地string.Replace("X","Y")不起作用?

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

编辑:谢谢你们。我提出了一个问题:为什么b+="FFF"有效但b.Replace没有?

11 个答案:

答案 0 :(得分:23)

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

Immutable objects
String Object

答案 1 :(得分:16)

  

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

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

  

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

强调我的。


  

因此,如果字符串是不可变的,为什么b + =“FFF”;工作?

好问题。

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

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

答案 2 :(得分:6)

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

另见(在众多中):

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

这样的事情
foreach (string msg in messages)
{
    totalMessage = totalMessage + message;
    totalMessage = totalMessage + "\n";
}

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

答案 3 :(得分:3)

字符串是不可变的。任何更改它们的操作都必须创建一个新字符串。

答案 4 :(得分:2)

StringBuilder支持内联替换方法。

如果需要进行大量的字符串操作,请使用StringBuilder。

答案 5 :(得分:2)

  

为什么“b + =”FFF“有效,但b.replace不是

因为+ =运算符当然会将结果分配回左手操作数。这只是b = b + "FFF";的简写。

简单的事实是你无法改变.Net中的任何字符串。字符串有 no 实例方法 - 您必须始终将操作结果分配给某处的字符串引用。

答案 6 :(得分:1)

是的,它是System.String的一种方法。但你可以试试 a = a.Replace(“X”,“Y”);

答案 7 :(得分:0)

如上所述,字符串是不可变的。

这意味着当您进行替换时,您将获得一个新字符串,而不是更改现有字符串。

如果您不将此新字符串存储在变量中(例如在声明为变量的变量中),则新字符串将不会保存在任何位置。

答案 8 :(得分:0)

要回答你的扩展问题,b + =“FFF”相当于b = b +“FFF”,所以基本上你也在这里创建一个新的字符串。

答案 9 :(得分:0)

只是为了更明确。 string.Replace(“X”,“Y”)返回一个新字符串...但由于您没有将新字符串分配给任何内容,新字符串将丢失。

答案 10 :(得分:0)

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