该代码非常不言自明。我预计当我做的时候a1
and b1
我正在创建两个包含相同文本的不同字符串实例。所以我想a1 == b1
是真的但是object.ReferenceEquals(a1,b1)
是假的,但事实并非如此。为什么?
//make two seemingly different string instances
string a1 = "test";
string b1 = "test";
Console.WriteLine(object.ReferenceEquals(a1, b1)); // prints True. why?
//explicitly "recreating" b2
string a2 = "test";
string b2 = "tes";
b2 += "t";
Console.WriteLine(object.ReferenceEquals(a2, b2)); // prints False
//explicitly using new string constructor
string a3 = new string("test".ToCharArray());
string b3 = new string("test".ToCharArray());
Console.WriteLine(object.ReferenceEquals(a3, b3)); // prints False
编译器将文字字符串对象合并为单个实例。这实际上是规范要求的 http://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx:
每个字符串文字不一定会产生一个新的字符串实例。当根据字符串相等运算符(第 7.9.7 节)等效的两个或多个字符串文字出现在同一程序集中时,这些字符串文字引用相同的字符串实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)