为什么string.Replace(“X”,“Y”)仅在分配给新字符串时有效?
我想它必须做一些字符串作为引用类型,但我不明白为什么简单string.Replace("X","Y")
不起作用?
为什么我需要做string A = stringB.Replace("X","Y")
? 我认为这只是在指定实例上完成的方法。
编辑:谢谢你到目前为止。 我提出了一个问题:为什么b+="FFF"
工作但b.Replace
不工作?
String.Replace是字符串类的共享函数,它返回一个新字符串。 它不是当前对象的运算符。 b.Replace(“a”,“b”)类似于只有c + 1的行。 所以就像c = c + 1实际上将c + 1的值设置为c,b = b.Replace(“a”,“b”)设置返回b的新字符串。
因为字符串是不可变的。 每次更改字符串.net created都会创建一个新的字符串对象。 这是class级的财产。
不可变的物体
字符串对象
为什么
stringA.Replace("X","Y")
不起作用?
为什么我需要做stringB = stringA.Replace("X","Y");
?
因为字符串在.NET中是不可变的。 您无法更改现有字符串对象的值,只能创建新字符串。 string.Replace
会创建一个新字符串,如果您希望保留对它的引用,则可以将其分配给某个字符串。 从文档:
返回一个新字符串 ,其中当前实例中所有出现的指定字符串都替换为另一个指定的字符串。
强调我的。
因此,如果字符串是不可变的,为什么b + =“FFF”; 工作?
好问题。
首先注意b += "FFF";
相当于b = b + "FFF";
(除了b只评估一次)。
表达式b + "FFF"
创建一个具有正确结果的新字符串,而不修改旧字符串。 然后将对新字符串的引用分配给b
替换对旧字符串的引用。 如果没有对旧字符串的其他引用,则它将有资格进行垃圾回收。
字符串是不可变的,这意味着一旦它们被创建,它们就不能再被更改了。 这有几个原因,据我所知主要是因为性能(如何在内存中表示字符串)。
另见(在众多中):
- http://en.wikipedia.org/wiki/Immutable_object
- http://channel9.msdn.com/forums/TechOff/58729-Why-are-string-types-immutable-in-C/
作为直接结果,每个字符串操作都会创建一个新的字符串对象。 特别是,如果你做的事情
foreach (string msg in messages) { totalMessage = totalMessage + message; totalMessage = totalMessage + "\n"; }
实际上,您可能会创建数十个或数百个字符串对象。 因此,如果您想更复杂地操作字符串,请遵循GvS的提示并使用StringBuilder。
字符串是不可变的。 任何更改它们的操作都必须创建一个新字符串。
StringBuilder支持内联替换方法。
如果需要进行大量的字符串操作,请使用StringBuilder。
为什么“b + =”FFF“有效,但b.replace不是
因为+ =运算符当然会将结果分配回左手操作数。 这只是b = b + "FFF";
的简短指针b = b + "FFF";
。
简单的事实是你不能改变.Net中的任何字符串。 字符串没有实例方法 – 您必须始终将操作结果分配给字符串引用。
是的,它是System.String的一种方法。 但你可以尝试a = a.Replace(“X”,“Y”);
正如上面所说的那样,字符串是不可变的。
这意味着当您进行替换时,您将获得一个新字符串,而不是更改现有字符串。
如果不将此新字符串存储在变量中(例如在声明为变量的变量中),则新字符串将不会保存在任何位置。
要回答你的扩展问题,b + =“FFF”相当于b = b +“FFF”,所以基本上你也在这里创建一个新的字符串。
只是为了更明确。 string.Replace(“X”,“Y”)返回一个新字符串…但由于您没有将新字符串分配给任何新字符串丢失。