C#中替换字符串中的字符串

25

有没有可能在不分配返回值的情况下替换字符串中的子字符串?

我有一个字符串:

string test = "Hello [REPLACE] world";

我想将子字符串 [REPLACE] 替换为其他内容:

test = test.replace("[REPLACE]", "test");

这个方法是可以的,但我想知道如何不将返回值赋值给变量呢?

我想做类似于这样的事情:

test.replace("[REPLACE]", "test");
7个回答

42

正如dlev所提到的,你无法使用.NET中的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"

29
你不能这样做,因为string是不可变的。它被设计成任何对字符串的“更改”实际上都会导致创建一个新的string对象。因此,如果你没有分配返回值(即“更新”的字符串,实际上是应用更改的原始字符串的副本),那么你实际上已经丢弃了想要进行的更改。
如果你想进行就地更改,你可以理论上直接使用char[](字符数组)进行操作,但这是危险的,应该避免。 另一个选择是(如Skeet先生所指出的)使用StringBuilder及其Replace()方法。话虽如此,像你展示的这样的简单替换非常快,因此除非你经常这样做,否则可能不需要费心使用StringBuilder

2

2

.NET中的字符串是不可变的。它们不能被直接编辑。

最接近直接编辑的方法是从字符串创建一个StringBuilder。这个类可以在内部对其内容进行编辑,然后再将其转换为字符串。

但是,这仍然会产生一个新的字符串,而不是修改原始字符串。然而,在循环中进行大量字符串操作时,这是一种有用的技术,可以避免生成大量中间字符串。


1

不行。在.NET中,字符串是不可变的。


你说得没错,但请添加一些额外的信息,以便那些不知道什么是不可变对象的人,例如代码或任何链接。 - Dayán Ruiz

1

在C#中,字符串是不可变的。这样做会违反这个规则。

你需要使用string作为返回类型,因为你正在处理的字符串是不可变的。


1
你可能应该为初学者包含一些关于不可变性的信息。 - user10722301

0
以下是从 HTML 内容中提取字符串并将其传递给 StringBuilder 的代码,然后从变量设置值的方式。您不能使用 string.replace。在操作时必须使用 StringBuilder。在 HTML 页面中,我添加了 [Name],它将被代码背后的名称替换。确保 [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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接