【问题标题】:How to create mutable .NET strings?如何创建可变的 .NET 字符串?
【发布时间】:2018-10-20 19:18:50
【问题描述】:

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

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

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

【问题讨论】:

  • 这不是改变字符串,而是有两个变量指向同一个字符串。您可以通过ref locals (string a = "Hello"; ref string b = ref a;) 获得它。
  • @GSerg:如果 String 作为任何正常的引用类型,Wich 可以正常工作。而不是像 .NET Framework 中的引用类型那样的单个最少引用。
  • GSerg 是对的;您正在寻找的根本不是可变字符串。您正在寻找的是变量别名,即同一个变量有两个名称ab。 C# 7 支持这一点。
  • 这是许多 C# 教程错误地解释不可变的含义的结果。

标签: c# .net string


【解决方案1】:

字符串是不可变的,这是一个非常重要的设计决策。它有助于在多任务上下文中使用它们,并允许进行许多其他优化,例如字符串实习。

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

对于其余情况,有StringBuilder class。谁的目的是绕过不变性和实习之类的东西。在更极端的层面上,您可能会制作自己的 Char 列表或数组。只是不要忘记提供自定义 ToString()。但是对于至少 95% 的情况,String 和 StringBuilder 类就足够了。

编辑:

在阅读了对您的 Originbal 帖子的评论后,我也注意到 mutabiltiy 似乎并不是您真正想要的。相反,您似乎要寻找的是正常的参考机制。虽然这个主题在某种程度上与不变性有关,但它实际上是一个独特的属性。参考应该工作。就像创建一个带有单个字符串字段的类并处理该类的实例一样。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是我阅读帖子原标题的正确答案。但是:.NET 中的任何参考检查都是在玩火。例如,String.RefrenceCheck 可以在调试和发布中产生不同的结果。我还假设 String 与 StringBuilder 强制转换会开始并给你错误的引用(它似乎不是 StringBuilder 的常量对象引用)。 .NET 中的对象引用作为我们应用程序级代码的一部分是可怕的。
      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多