之前可能已经提出这个问题,但我无法找到它。我不认为我的googlefu足够好了。无论如何,
说我有这个:
string cat = "meow"
cat = cat.replace("meow","purr");
cat = Regex.Replace(cat, "purr", "Meow!");
将cat变量设置为受操作的副本似乎更为明显。有没有办法通过ref方式执行此操作,以便我不必将变量设置为自身的修改版本?
要清楚上面的第2和第3行,我在这里问。
编辑:我不相信marked dupe是我问题的绝对欺骗。我的问题是针对这种事物的存在的询问。链接的帖子特定于解释为什么它存在。对于那些不熟悉不可变概念的人来说,这个问题可能仍然值得保留。答案 0 :(得分:2)
在C#中,字符串是不可变的。这意味着您无法安全地更改变量引用的字符串值。即没有看起来像这样的方法:
string cat = "meow";
cat.replace("meow", "purr");
Console.WriteLine(cat); // expected "purr", but output is still "meow"
您可以为要变换变量的每个字符串操作编写包装器方法,例如:
void replace(ref string value, string regex, string replaceString) {
value = value.replace(regex, replaceString);
}
然后使用它:
replace(cat, "meow", "purr");
但是,不这样做。它凌乱而且不可维护。为您可能想要执行的每个String操作编写方法,这样您就可以实现字符串可变性的错觉,这不是一种好的做法。
您可以尝试使用StringBuilder
,这看起来像:
string cat = "meow";
StringBuilder stringBuilder = new StringBuilder(cat);
stringBuilder.Replace("meow", "purr");
Console.WriteLine(stringBuilder.ToString());
答案 1 :(得分:1)
来自文档:
因为字符串是不可变的,所以不可能(不使用 不安全的代码)来修改字符串对象之后的值 创建。但是,有许多方法可以修改字符串的值 并将结果存储在新的字符串对象中。
然而,您可以使用StringBuilder类:
StringBuilder builder = new StringBuilder();
builder.Append("Juan");
builder.Replace("Juan", "Javier");
Console.WriteLine(builder.ToString()); //This outputs "Javier"
StringBuilder还允许您使用索引修改字符级别的字符串:
builder[0] = 'X';
Console.WriteLine(builder.ToString()); //This outputs "Xavier"