百度空间 | 百度首页 
 
查看文章
 
C#中的equals与==的比较(2)
2007年12月13日 星期四 09:49 P.M.

对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
==操作比较的是两个变量的值是否相等
equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。static void Main()
    {       

        string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
        string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });        //未开辟新内存空间,使用的还是a的内存空间,相当于a对象,它们两个在堆中使用的是一个内存空间.当建立b时,先在堆中查找有没有 所需要的内容,有的话,就直接指向,没有的话就新建一个
         Console.WriteLine (a==b);                                                //输出true,
        Console.WriteLine (a.Equals(b));                                           //输出true,

         object c = new object();
        object d = new object();      //在堆中开辟新的内存空间,对象内容与c是不同的,与字符串对象不同,这样的对象建立的时间,不用在堆中查找有没有相同的内容,直接在堆内存中开辟一块新的内存空间.
        Console.WriteLine(c == d);            //输出false,因为cd它们两个在栈中的内容不一样
        Console.WriteLine(c.Equals(d));     
//输出false,因为虽然建立cd时所用的语法是一样的,但终究它们不是相同的对象,只有用object d=c;这样才是相同的对象

   object e = new object();
         object f = e;                     新建立对象f,这时把已经有的对象赋给f,这样f就不会在堆内存中开辟新的内存空间,而是直接把,e的引用传给f,也就是把e在栈中的引用值,传到f在栈中的内存中.这样它们就同时指向了相同的椎内存.
        Console.WriteLine(c == d);
        Console.WriteLine(c.Equals(d));

}
说明equals比较的是堆中的内容,也就是两个对象的内容;
而==比较的是值,也就是栈中的内容.

总结,用string 建立新对象时,会在内存中查找有没有相同的内容,有的话,直接把新建立的对象指过去,没有的话,就在堆中开辟新的内存空间.这个string对象还是比较特殊的.
而用其它类新建立的对象,就没有在堆中查找的步骤,直接在堆内存中开辟一块新的内存空间.当然不包括下面这种形式:   
object e = new object();
object f = e;
把新建立的对象以原有的对象赋值,这样就不会在堆内存中开辟新的空间.

以上内容是操作中得到的,正确与否,有待进一步考察.
(在java中好像以下是建立不相同的对象,也就是说在堆中的不共用内存,当然在栈内存中保留的引用也不相同,但彼此的堆内容是相同的,都是字符串"abc".       
string a = new string("abc");
string b = new string("abc")


类别:c# | | 分享到i贴吧 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2010 Baidu