我和我的朋友正在讨论 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"
并检查它是否已经存在,如果是,那么丢弃新创建的字符串?有人可以解释这里的魔法吗?