有没有可能在不分配返回值的情况下替换字符串中的子字符串?
我有一个字符串:
string test = "Hello [REPLACE] world";
我想将子字符串 [REPLACE]
替换为其他内容:
test = test.replace("[REPLACE]", "test");
这个方法是可以的,但我想知道如何不将返回值赋值给变量呢?
我想做类似于这样的事情:
test.replace("[REPLACE]", "test");
正如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"
string
是不可变的。它被设计成任何对字符串的“更改”实际上都会导致创建一个新的string
对象。因此,如果你没有分配返回值(即“更新”的字符串,实际上是应用更改的原始字符串的副本),那么你实际上已经丢弃了想要进行的更改。char[]
(字符数组)进行操作,但这是危险的,应该避免。
另一个选择是(如Skeet先生所指出的)使用StringBuilder
及其Replace()
方法。话虽如此,像你展示的这样的简单替换非常快,因此除非你经常这样做,否则可能不需要费心使用StringBuilder
。.NET中的字符串是不可变的。它们不能被直接编辑。
最接近直接编辑的方法是从字符串创建一个StringBuilder
。这个类可以在内部对其内容进行编辑,然后再将其转换为字符串。
但是,这仍然会产生一个新的字符串,而不是修改原始字符串。然而,在循环中进行大量字符串操作时,这是一种有用的技术,可以避免生成大量中间字符串。
不行。在.NET中,字符串是不可变的。
在C#中,字符串是不可变的。这样做会违反这个规则。
你需要使用string作为返回类型,因为你正在处理的字符串是不可变的。
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());