110,539
社区成员
发帖
与我相关
我的任务
分享
static void Main(string[] args)
{
string x = "should it matter";
string y = "should it matter";
if (object.ReferenceEquals(x, y))
{
Console.WriteLine("same reference.");
}
Console.Read();
}
程序运行的结果是输出了“same reference.”,照理说我声明两个string变量,它们不应该指向相同的托管堆地址啊?!事实上这里涉及到一个所谓的“字符串留用”机制,根据Jeffrey Richter在《框架设计:CLR via C#》中所说,CLR存在一种机制,当它初始化时,它会创建一个内部哈希表,此表中key是字符串,value是对托管堆中的string对象的引用。当定义一个string 时,就会在内部哈希表中检查是否有相匹配的。如果不存在完全相同的字符串,就创建字符串副本,将字符串副本添加到内部哈希表中,并返回这个副本的引用。如果存在完全相同的字符串,就返回对现有字符串的引用。static void Main(string[] args)
{
string x = "should it matter";
x = x + " ?"; //breakpoint (1)
}//breakpoint (2)
!load sos.dll
extension C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"sos.dll loaded
!clrstack -a
PDB symbol for mscorwks.dll not loaded
OS Thread Id: 0x1508 (5384)
ESP EIP
0012f440 012f009f ConsoleApplication1.Program.Main(System.String[])
PARAMETERS:
args = 0x0137cdc8
LOCALS:
<CLR reg> = 0x0137cdd8
0012f69c 79e7c74b [GCFrame: 0012f69c]
!clrstack -a
OS Thread Id: 0x1508 (5384)
ESP EIP
0012f440 012f00b0 ConsoleApplication1.Program.Main(System.String[])
PARAMETERS:
args = 0x0137cdc8
LOCALS:
<CLR reg> = 0x0137ce24
0012f69c 79e7c74b [GCFrame: 0012f69c]
string text = "simple string";
text = "other string";