Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建可变的.NET字符串?_C#_.net_String - Fatal编程技术网

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

C# 如何创建可变的.NET字符串?,c#,.net,string,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"); 字符串是不可变的,这是一个非常重要的设计决策。它有助于在多任务环境中

.NET字符串始终是不可变的,但是如何创建一个等价的
System.String
类来更改字符串值呢

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

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

字符串是不可变的,这是一个非常重要的设计决策。它有助于在多任务环境中使用它们,并允许一系列其他优化,如字符串插入

通常不稳定性不是问题。除非您正在执行大量的字符串操作,否则GC在运行时可以处理积累的少量死字符串

对于其余的案例,存在以下问题。他们的目的是绕过不确定性和类似国际化的东西。在更极端的层次上,您可以创建自己的字符列表或数组。只是别忘了提供一个自定义ToString()。但至少95%的情况下,String和StringBuilder类就足够了

编辑:


在阅读了你的原创帖子的评论后,我也注意到易变性似乎并不是你真正想要的。而你似乎在寻找的是正常的参考力学。虽然这个主题在某种程度上与不可变性有关,但它实际上是一个独特的属性。ref应该可以工作。正如创建一个带有单个字符串字段的类并处理该类的实例一样。

正如@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);
    }

System.Text.StringBuilder类是一个可变字符串。您可以使用索引器更改pos中的字符(仅一个字符),并使用Insert、Replace、Append和AppendLine以最快的方式更改StringBuilder本身。这些方法将实例返回给同一个string builder对象,因此,实际上不需要指定返回值。

这不是对字符串进行变异,而是有两个变量指向同一个字符串。您可以使用(
stringa=“Hello”;ref-stringb=ref-a;
)。@GSerg:Wich可以将字符串作为任何正常的引用类型。而不是.NET Framework.GSerg中单一的最少类似引用的引用类型是正确的;您要查找的是根本不是可变字符串。您要查找的是变量别名,即同一变量有两个名称
a
b
。C#7支持这一点。这是因为许多C#教程错误地解释了不可变的含义。这是我阅读文章原始标题的正确答案。但是:在.NET中的任何引用签入都是在玩火。例如,String.referenceCheck在调试和发布时可能会产生不同的结果。我还假设String与StringBuilder的转换会起作用,并且无论如何都会给您错误的引用(对于StringBuilder来说,它似乎不是常量对象引用)。NET中的对象引用作为我们应用程序级代码的一部分是可怕的。