.NET字符串始终是不可变的,但是如何使一个等效的System.String
类可以改变字符串值呢?
例如:更改a
时,我也希望更改b
。
var a = "Hello";
var b = a;
a = "World";
var shouldBeTrue = String.ReferenceEquals(a, b)
&& String.Equals(b, "World");
答案 0 :(得分:3)
字符串是不可变的,这是一个非常重要的设计决策。它有助于在多任务处理上下文中使用它们,并允许进行其他一系列优化,例如字符串插入。
通常不变性不是问题。除非您要执行大量的字符串操作,否则当GC运行起来时,GC可以处理少量的死字符串。
对于其余情况,有StringBuilder class。谁的目标是解决不变性和诸如实习之类的问题。在更极端的水平上,您可以创建自己的Char列表或数组。只是不要忘记提供一个自定义的ToString()。但是至少在所有情况下,至少有95%的String和StringBuilder类足够。
编辑:
在阅读了您对Originbal帖子的评论后,我也注意到可变性似乎并不是您真正想要的。相反,您似乎要寻找的是正常的参考力学。尽管该主题在某种程度上与不变性有关,但实际上它是一个独特的属性。裁判应该工作。就像用单个字符串字段创建一个类并传递该类的实例一样。
答案 1 :(得分:0)
正如@Christopher所指出的,您真正想要的不是字符串可变性,而是使多个此类引用保持同步的引用机制。最简单的这种机制是包装器类,如下面的示例所示:
class Wrapper
{
public string Value { get; set; }
}
static void Main(string[] args)
{
Wrapper a = new Wrapper();
a.Value = "Hello";
Wrapper b = a;
a.Value = "World";
System.Diagnostics.Debug.Assert(ReferenceEquals(a, b));
System.Diagnostics.Debug.Assert(a.Value == b.Value);
}
答案 2 :(得分:-1)
System.Text.StringBuilder类是可变字符串。您可以使用索引器来更改pos中的字符(仅一个字符),并使用Insert,Replace,Append和AppendLine以最快的方式对StringBuilder本身进行更改。这些方法将实例返回到相同的字符串生成器对象,因此,您实际上不需要分配返回值。