string msg1 = "abc";
            string msg2 = "abc";
            if (object.ReferenceEquals(msg1, msg2))
            {
                string he = "yes";
            }

解决方案 »

  1.   

    string是个特殊的类型,为了避免大量string的内存占用,运行时会维护一个string的池,相同内容的字符串都从池里获取,所以同样内容的string其实会引用到同一个对象。
      

  2.   

    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.
      

  3.   

    http://www.cnblogs.com/milkman-nuaa/archive/2010/03/26/1696884.html
    另外,这里面的提到了字符串池的概念。
      

  4.   


    让你了解这个不是问为什么而是让你通过观察,记住这个结论。真正编写代码很少有人会对string调用ReferenceEquals。但是你要知道,string的拼接是反复创建了多个string才得到的,因此这种拼接效率很低。
      

  5.   

    调试了一下,你看结果吧,如果你不用new的方式得到的结果就是相等的(上面所说的线程池),如果你用new的话那么就是新实例了
      

  6.   


    晕,线程池也出来了,这关线程池什么事。
    用new仍然是相等的,上面有人的话算白说了。
      

  7.   


    口误,string池,其实不用new也可以创建string的实例,是因为内部有一个 ldstr IL ,参考http://stackoverflow.com/questions/3328707/why-dont-we-use-new-operator-while-initializing-a-string
      

  8.   

    另外,@caozhy, 你可以自己调试一下,看看用new是不是相等的
      

  9.   

    你可以自己调试一下,看看用new是不是相等的嗯,你是对的。因为string是只读的,所以编译器对编译期的字符串处理做了优化。
    1L和我都搞错了。
      

  10.   

    本帖最后由 caozhy 于 2013-10-31 11:48:24 编辑
      

  11.   

    这是JAVA中的常量池这个概念在作用,所以相等
      

  12.   

    在C#中,如果你写成string msg1 = "abc";,那么在编译期间,就会转化为如下IL指令并存储到metadata中去LdStr "abc",那么此时,如果你再定义一个string msg2 = "abc";,编译器就会识别到"abc"已经存在了,就会调用这条IL指令将这个引用msg1指向msg2,当然你用new的方式的话那肯定就是实例化新的实例了,这个就不起效果了。另外,字符串在做加减等操作时,因为string是不变的引用类型,所以等于说只要你对string做了一些操作,那么一般情况下都回生成新的实例。关于string池,string有一个方法string.Intrrn(string str),这方法就会在string池里面找到与str值相等的string引用并返回,如果你用了很多这样的方法,可以说是节省了内存空间,但是用多了也不好,因为它会一直占用着不会释放知道CLR终止,也就是说,它会一直存在知道你的程序终止。
      

  13.   

    你们猜猜string.Empty和""是不是相等?
      

  14.   

    一个基础知识而已。
    每本.net的基础书都会提到的。
    这也是为什么我们在频繁使用字符串组合的时候应该使用StringBuilder而不是用string的根本原因。
    会在拼接过程中产生大量的冗余的字符串碎片。
      

  15.   

    String 池
    String这个对象比较特殊!
      

  16.   

    new String msg1=“abc”;
    new String msg2=“abc”;
    new其实是实例化了,把“abc”的地址赋给你所定义的变量了,所以每一次new,都会新开辟一个地址。当然两次开辟的地址会不相等。但是如果没new的话,就相当于给两个字符串变量赋了一样的值。
      

  17.   


      string msg1 = "abc";
      string msg2 = new String("abc");
      if (object.ReferenceEquals(msg1, msg2))
      {
            string he = "yes";
      }
       else
      { 
            string he = "NO";
      }       这样就不相等了。。楼主自己看看基础吧
      

  18.   

    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.
      

  19.   

    string是个特殊的类型 有一点就是允许字符串常量直接对他赋值msg1和msg2这两个引用都指向字符串常量"abc"
      

  20.   

    msg1和msg2这两个引用都指向字符串常量"abc"
      

  21.   

    java中其实是一样的。拼接的时候用StringBuilder优化的。可以看生成的字节码。
      

  22.   


    void hehe()
    {
       int a;//hehe
    }