如何创建可变的.NET字符串?

时间:2018-10-20 19:18:51

标签: c# .net string

.NET字符串始终是不可变的,但是如何使一个等效的System.String类可以改变字符串值呢?

例如:更改a时,我也希望更改b

var a = "Hello";
var b = a;
a = "World";
var shouldBeTrue = String.ReferenceEquals(a, b) 
                   && String.Equals(b, "World");

3 个答案:

答案 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本身进行更改。这些方法将实例返回到相同的字符串生成器对象,因此,您实际上不需要分配返回值。