是否可以在不指定返回值的情况下替换字符串中的子字符串?
我有一个字符串:
string test = "Hello [REPLACE] world";
我希望用其他东西替换子串[REPLACE]
:
test = test.replace("[REPLACE]", "test");
这样可以正常工作,但是如果不将返回值赋给变量怎么办?我想要这样的东西:
test.replace("[REPLACE]", "test");
答案 0 :(得分:27)
你不能,因为 string
是不可变的。它的设计使得对字符串的任何“更改”实际上都会导致创建新的string
对象。因此,如果您没有分配返回值(这是“更新的”字符串,实际上是应用了更改的原始字符串的副本),您实际上已经放弃了您想要进行的更改。
如果您想进行就地更改,理论上您可以直接使用char[]
(字符数组),但很危险,应该避免。 < / p>
另一个选择(如下面的Skeet先生所指出的)是使用StringBuilder
及其Replace()
方法。话虽这么说,像你所展示的那样简单的替换很快,所以你可能不想打扰StringBuilder
,除非你经常这样做。
答案 1 :(得分:25)
正如dlev所提到的,你不能用string
执行此操作,因为.NET中的字符串是 immutable - 一旦构造了一个字符串,你就无能为力(不包括不安全)代码或反射)来改变内容。这使得字符串通常更容易可以使用,因为您不需要担心防御性复制,它们自然是线程安全等。
然而,它的可变表亲是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"
答案 2 :(得分:2)
你做不到。您必须将值赋值为字符串是不可变的
答案 3 :(得分:2)
.NET中的字符串是不可变的,它们不能在线编辑。
离线编辑最接近的是从字符串创建StringBuilder
,内嵌其内容,然后让它再次吐出一个字符串。但这仍然会产生一个新的字符串,而不是改变原始字符串。但是,这是一种有用的技术,可以避免在进行大量字符串摆弄时产生大量中间字符串,例如:在循环中。
答案 4 :(得分:1)
你不能,字符串在.NET中是不可变的
答案 5 :(得分:1)
你不能,在C#字符串中是不可变的。这样的事情会违反这一点。您需要具有返回类型的字符串,因为您正在使用的字符串不能更改。
答案 6 :(得分:0)
以下是从html获取字符串并传递StringBuilder并从变量中设置值的代码。你不能做string.replace.You必须在操作时使用StringBuilder。在html页面中我添加了[Name]被替换来自代码后面的名称。确保[名称]是唯一的,或者你可以给出任何唯一的名称。
string Name = txtname.Text;
string contents = File.ReadAllText(Server.MapPath("~/Admin/invoice.html"));
StringBuilder builder = new StringBuilder(contents);
builder.Replace("[Name]", Name);
StringReader sr = new StringReader(builder.ToString());