这要从string类型的内存驻留机制说起,这也是CLR对其进行优化的一种方式
#region string类型特殊的内存驻留机制 //string类型的特殊之处就在于CLR之中做的相关的优化 //当有多个字符串变量包含了同样的字符串实际值时, //CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。 string strA = "Hello"; string strB = "Hello"; Console.WriteLine(Object.Equals((Object)strA, (Object)strB)); Console.WriteLine(Object.ReferenceEquals((Object)strA, (Object)strB)); Console.WriteLine(strA.GetHashCode()); Console.WriteLine(strB.GetHashCode()); string str1 = "Hello"; string str2 = "Hello"; Console.WriteLine(Object.ReferenceEquals(str1, str2)); //关于驻留池 字面声明的变量没有检查驻留池 StringBuilder sbr = new StringBuilder(); sbr.Append("He").Append("llo"); string str3 = "Hello"; string str4 = sbr.ToString(); Console.WriteLine(Object.ReferenceEquals(str3, str4)); //返回false,虽然两个字符串的值相同,但是在内存中式不相同的两个引用 Console.WriteLine(Object.ReferenceEquals(str3, str1)); //强制CLR检查驻留池 StringBuilder sbr2 = new StringBuilder(); sbr2.Append("He").Append("llo"); string str5 = "Hello"; //在转换之后进行检查,时候有相同的字符串在内存中,如果存在,就返回一个指向它的引用 string str6 = String.Intern(sbr2.ToString()); Console.WriteLine(Object.ReferenceEquals(str5, str6)); #endregion