日期:2014-05-17  浏览次数:20741 次

为什么会相等呢
            string msg1 = "abc";
            string msg2 = "abc";
            if (object.ReferenceEquals(msg1, msg2))
            {
                string he = "yes";
            }

------解决方案--------------------
string是个特殊的类型,为了避免大量string的内存占用,运行时会维护一个string的池,相同内容的字符串都从池里获取,所以同样内容的string其实会引用到同一个对象。
------解决方案--------------------
编绎器为了提高性能,采用了字符串池的方案。将单个字符串的多个实例合并成一个实例。
------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/system.object.referenceequals.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
总之,如果字符串内容完全相同,string的变量就会指向同一个地址。所以object.ReferenceEquals方法是相等的,或者说msg1==msg2.
------解决方案--------------------
http://www.cnblogs.com/milkman-nuaa/archive/2010/03/26/1696884.html
另外,这里面的提到了字符串池的概念。
------解决方案--------------------
引用:
            string msg1 = "abc";
            string msg2 = "abc";
            if (object.ReferenceEquals(msg1, msg2))
            {
                string he = "yes";
            }


让你了解这个不是问为什么而是让你通过观察,记住这个结论。真正编写代码很少有人会对string调用ReferenceEquals。但是你要知道,string的拼接是反复创建了多个string才得到的,因此这种拼接效率很低。
------解决方案--------------------
调试了一下,你看结果吧,如果你不用new的方式得到的结果就是相等的(上面所说的线程池),如果你用new的话那么就是新实例了