jeb*_*jeb 14 c# string replace
是否可以在不指定返回值的情况下替换字符串中的子字符串?
我有一个字符串:
string test = "Hello [REPLACE] world";
Run Code Online (Sandbox Code Playgroud)
我想[REPLACE]用其他东西替换子串:
test = test.replace("[REPLACE]", "test");
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是如果不将返回值赋给变量,我怎么能这样做呢?我想要这样的东西:
test.replace("[REPLACE]", "test");
Run Code Online (Sandbox Code Playgroud)
dle*_*lev 27
你不能,因为string是不可改变的.它的设计使得对字符串的任何"更改"实际上都会导致创建新string对象.因此,如果您没有指定返回值(即"已更新"字符串,实际上是应用了更改的原始字符串的副本),则您已经有效地放弃了您想要进行的更改.
如果你想进行就地更改,理论上可以直接使用char[](字符数组),但这很危险,应该避免.
另一种选择(如下面的Skeet先生所指出的)是使用StringBuilder它的Replace()方法.话虽这么说,像你所展示的简单替换很快,所以你可能不想打扰,StringBuilder除非你经常这样做.
Jon*_*eet 27
正如dlev所提到的,你无法做到这一点,string因为字符串在.NET中是不可变的 - 一旦构造了一个字符串,你就无法做任何事情(不包括不安全的代码或反射)来改变内容.这使得字符串通常更容易使用,因为您不需要担心防御性复制,它们自然是线程安全的等等.
然而,它的可变表亲是StringBuilder- 它有一种Replace执行对象替换的方法.例如:
string x = "Hello [first] [second] world";
StringBuilder builder = new StringBuilder(x);
builder.Replace("[first]", "1st");
builder.Replace("[second]", "2nd");
string y = builder.ToString(); // Value of y is "Hello 1st 2nd world"
Run Code Online (Sandbox Code Playgroud)