char[] ch ={ 'a', 'b', 'c', 'd' };
String s1 = new String(ch);
String s2 = new String(ch);我用Console.WriteLine(Object.Equals(s1,s2))打印出来结果为True,是不是说明只有一个String对象?如果是,那么我都是用new新建的字符串对象啊,为什么只有一个呢?

解决方案 »

  1.   

    你再试一下这两种情况:1. 
    char[] ch ={ 'a', 'b', 'c', 'd' };
    String s1 = new String(ch);
    String s2 = new String(ch);
    Console.WriteLine((s1==s2).ToString());2.
    char[] ch ={ 'a', 'b', 'c', 'd' };
    String s1 = ch;
    String s2 = ch;
    Console.WriteLine((s1==s2).ToString());
      

  2.   

    首先我不是高手,我也是菜鸟,我的个人看法是,Object.Equals是用来比较两个对象是否相等,并不是看内存里有几个对象,你用了两个New也就意味着你在内存中有两个String对象,不过这两个对象是相同的,是由同一个对象得来得.
      

  3.   

    Equals(s1,s2)
    返回值为boolean值
      

  4.   

    楼上,对于Object.Equals,msdn的给出的解释是:对于引用类型,相等定义为对象相等;即这些引用是否引用同一对象。对于值类型,相等定义为按位相等
    所以说,如果a和b引用的是两个对象的话,即使它们完全一样,Object.Equals(a,b)也不会相等 Cylinder c1 = new Cylinder(1, 2, 3, 4);
     Cylinder c2 = new Cylinder(1, 2, 3, 4);
     Console.WriteLine(Object.Equals(c1,c2));这是我做的试验,Cylinder是我自己定义的一个圆柱体类,最后输出的是False
      

  5.   

    String s1 = ch;
    String s2 = ch;
      

  6.   

    其实String是一个引用类型,而不是值类型,它保留在堆上,不是堆栈上,但对String的操作又和普通的引用类型不同,这实际上是运算符重载的问题
      

  7.   

    using System.Reflection;//测试如下代码你就明白了char[] ch ={ 'z', 's', 'w', 'a', 'n', 'g', '路', '过' };
    String s1 = new String(ch);
    String s2 = new String(ch);
    String s3 = s1;MessageBox.Show(Pointer.ReferenceEquals(s1, s2).ToString()); // False
    MessageBox.Show(Pointer.ReferenceEquals(s1, s3).ToString()); // True
      

  8.   

    不需要Pointer对象ReferenceEquals()是object的方法MessageBox.Show(object.ReferenceEquals(s1, s2).ToString()); // False
    MessageBox.Show(object.ReferenceEquals(s1, s3).ToString()); // True
      

  9.   

    这是因为 string类的特殊性。在c#中有个技术叫 字符串驻留 ,也就是说编译器会把一个应用程序中的 相等的 常量字符串 存储在一通用的位置,这样就避免了不必要的复制操作。那么你会问?难道2个 s1和s2是常量字符串。答案:YES!string 代表一个不可变的字符串,不可变是因为一旦创建它,就不能修改他的值。那些看似修改字符串的值实际上返回的是一个包含修改结果的新字符串。
      

  10.   

    字符串驻留。在托管堆上会有一段内存专门用于保存String对象(每次新建一个字符串,会检查是否已经存在相同字符串),为了提高字符串比较的速度。
      

  11.   

    我是个菜鸟,我做了个简单的测试,发现:
    1   object.ReferenceEquals(object1,object2)
    2   object.Equals(object1,object2)
    1,2 是不同的,第一个是比对是否是同一个实例,而第二个比对的是内容是否相同
    不知道对不对
    谢谢楼主 呵呵