我和我的朋友正在讨论 Dotnet 框架中的字符串,它们如何是引用类型但行为却像值类型(不可变)。我们都知道字符串是 CLR 内部的,但是在简短的讨论中我们并没有真正得出结论,字符串是如何由 CLR/Framework 创建和管理的。
例如,在下面的代码中,显然s1和s2是不同的实例,但是正如您所看到的,当我s2.ToUpper()执行结果时,请参考s1.
    public static void Main (string[] args)
    {
        string s1 = "HELLO";
        string s2 = "hello";
        Console.WriteLine (s1.GetHashCode()); //Prints 68624562
        Console.WriteLine (s2.GetHashCode()); //Prints 99162322
        Console.WriteLine (s2.ToUpper().GetHashCode()); //Prints 68624562 too!
    }
所以,问题是调用s2.ToUpper()CLR 是否创建了新字符串"HELLO"并检查它是否已经存在,如果是,那么丢弃新创建的字符串?有人可以解释这里的魔法吗?