如何获取可变字符串列表?

raf*_*lio 2 c# string reference

我有以下代码

  List<String> l = new List<String>();
  String s = "hello";
  l.Add(s);
  s = "world";
Run Code Online (Sandbox Code Playgroud)

当我设置一些断点并完成程序时,在执行最后一行之后,列表中的值仍然是hello而不是world.

它不应该相等world吗?字符串不是一个对象,我不只是将一个指针插入列表中吗?稍后,如果我将字符串更改为指向不同的值("world"),为什么我的列表仍然引用旧值?

我怎样才能达到理想的效果?非常感谢!

Ada*_*rth 5

字符串是不可变的,因此不起作用.当您尝试设置它时,实际上是将指针放到旧字符串上并在引擎盖下创建一个新字符串.

要获得所需的效果,请创建一个包装字符串的类:

public class SortOfMutableString
{
    public string Value {get;set;}

    public SortOfMutableString(string s)
    { 
        Value = s;
    }

    public static implicit operator string(SortOfMutableString s)
    {
        return s.Value;
    }

    public static implicit operator SortOfMutableString(string s)
    {
        return new SortOfMutableString(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在列表中使用它.然后引用将指向类,但您可以在其中包含字符串值.为了使它更好,可以覆盖implicit与字符串之间的强制转换,这样您甚至不需要看到您正在与之交谈SortOfMutableString.

请参阅Jon Skeet的答案,毫无疑问是对C#中字符串的非常准确的解释,我甚至都不打扰!

替代类名:

  • PseudoMutableString
  • ICantBelieveItsNotMutable
  • HappyAndReferenceableString