将字符串操作应用于变量而不将变量=设置为结果?

时间:2017-07-20 18:17:17

标签: c# regex string variables

之前可能已经提出这个问题,但我无法找到它。我不认为我的googlefu足够好了。无论如何,

说我有这个:

string cat = "meow"
cat = cat.replace("meow","purr");
cat = Regex.Replace(cat, "purr", "Meow!");

将cat变量设置为受操作的副本似乎更为明显。有没有办法通过ref方式执行此操作,以便我不必将变量设置为自身的修改版本?

要清楚上面的第2和第3行,我在这里问。

编辑:我不相信marked dupe是我问题的绝对欺骗。我的问题是针对这种事物的存在的询问。链接的帖子特定于解释为什么它存在。对于那些不熟悉不可变概念的人来说,这个问题可能仍然值得保留。

2 个答案:

答案 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"