天天看點

C#中==和equals的差别

對于值類型,如果對象的值相等,則相等運算符 (==) 傳回 true,否則傳回 false。對于string 以外的引用類型,如果兩個對象引用同一個對象,則 == 傳回 true。對于 string 類型,== 比較字元串的值。

    ==操作比較的是兩個變量的值是否相等。

    equals()方法比較的是兩個對象的内容是否一緻.equals也就是比較引用類型是否是對同一個對象的引用。

    對于值類型的比較,這裡就不做描述了,下面讨論引用類型的比較:

首先我們看一段程式

C#中==和equals的差别

using  System;

C#中==和equals的差别

using  System.Collections.Generic;

C#中==和equals的差别

using  System.Linq;

C#中==和equals的差别

using  System.Text;

C#中==和equals的差别
C#中==和equals的差别

namespace  ConsoleApplication1

C#中==和equals的差别

{

C#中==和equals的差别

     class  Person

C#中==和equals的差别

     {

C#中==和equals的差别

         private   string  name;

C#中==和equals的差别
C#中==和equals的差别

         public   string  Name

C#中==和equals的差别

         {

C#中==和equals的差别

             get   {  return  name; }

C#中==和equals的差别

             set   { name  =  value; }

C#中==和equals的差别

        }

C#中==和equals的差别
C#中==和equals的差别

         public  Person( string  name)

C#中==和equals的差别

         {

C#中==和equals的差别

             this .name  =  name;

C#中==和equals的差别

        }

C#中==和equals的差别

    }

C#中==和equals的差别

}

C#中==和equals的差别

using  System;

C#中==和equals的差别

using  System.Collections.Generic;

C#中==和equals的差别

using  System.Linq;

C#中==和equals的差别

using  System.Text;

C#中==和equals的差别
C#中==和equals的差别

namespace  ConsoleApplication1

C#中==和equals的差别

{

C#中==和equals的差别

     class  Program

C#中==和equals的差别

     {

C#中==和equals的差别

         static   void  Main( string [] args)

C#中==和equals的差别

         {

C#中==和equals的差别

             string  a  =   new   string ( new   char []  {  ' h ' ,  ' e ' ,  ' l ' ,  ' l ' ,  ' o '  } );

C#中==和equals的差别

             string  b  =   new   string ( new   char []  {  ' h ' ,  ' e ' ,  ' l ' ,  ' l ' ,  ' o '  } );

C#中==和equals的差别

            Console.WriteLine(a  ==  b);

C#中==和equals的差别

            Console.WriteLine(a.Equals(b));

C#中==和equals的差别
C#中==和equals的差别

             object  g  =  a;

C#中==和equals的差别

             object  h  =  b;

C#中==和equals的差别

            Console.WriteLine(g  ==  h);

C#中==和equals的差别

            Console.WriteLine(g.Equals(h));

C#中==和equals的差别
C#中==和equals的差别

            Person p1  =   new  Person( " jia " );

C#中==和equals的差别

            Person p2  =   new  Person( " jia " );

C#中==和equals的差别

            Console.WriteLine(p1  ==  p2);

C#中==和equals的差别

            Console.WriteLine(p1.Equals(p2));

C#中==和equals的差别
C#中==和equals的差别
C#中==和equals的差别

            Person p3  =   new  Person( " jia " );

C#中==和equals的差别

            Person p4  =  p3;

C#中==和equals的差别

            Console.WriteLine(p3  ==  p4);

C#中==和equals的差别

            Console.WriteLine(p3.Equals(p4));

C#中==和equals的差别
C#中==和equals的差别

            Console.ReadLine();

C#中==和equals的差别

        }

C#中==和equals的差别

    }

C#中==和equals的差别

}

運作程式,會輸出什麼呢?

答案是 true,true,false,true,false,false,true,true。

為什麼會出現這個答案呢?因為值類型是存儲在記憶體中的堆棧(以後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的位址,而其本身則存儲在堆中。

    ==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的位址是否相同,即棧中的内容是否相同。

    equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的内容是否相同。

    而字元串是一個特殊的引用型類型,在C#語言中,重載了string 對象的很多方法方法(包括equals()方法),使string對象用起來就像是值類型一樣。

    是以在上面的例子中,字元串a和字元串b的兩個比較是相等的。

    對于object g 和object h 時記憶體中兩個不同的對象,是以在棧中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字元串a和b作這樣的修改:

        string a="aa";

        string b="aa";

則,g和h的兩個比較都是相等的。這是因為系統并沒有給字元串b配置設定記憶體,隻是将"aa"指向了b。是以a和b指向的是同一個字元串(字元串在這種指派的情況下做了記憶體的優化)。

對于p1和p2,也是記憶體中兩個不同的對象,是以在記憶體中的位址肯定不相同,故p1==p2會傳回false,又因為p1和p2又是對不同對象的引用,是以p1.equals(p2)将傳回false。

對于p3和p4,p4=p3,p3将對對象的引用賦給了p4,p3和p4是對同一個對象的引用,是以兩個比較都傳回true。

如果我們對person的equals方法重寫:

C#中==和equals的差别

using  System;

C#中==和equals的差别

using  System.Collections.Generic;

C#中==和equals的差别

using  System.Linq;

C#中==和equals的差别

using  System.Text;

C#中==和equals的差别
C#中==和equals的差别

namespace  ConsoleApplication1

C#中==和equals的差别
C#中==和equals的差别

{

C#中==和equals的差别

     class  Person

C#中==和equals的差别

     {

C#中==和equals的差别

         private   string  name;

C#中==和equals的差别
C#中==和equals的差别

         public   string  Name

C#中==和equals的差别

         {

C#中==和equals的差别

             get   {  return  name; }

C#中==和equals的差别

             set   { name  =  value; }

C#中==和equals的差别

        }

C#中==和equals的差别
C#中==和equals的差别

         public  Person( string  name)

C#中==和equals的差别

         {

C#中==和equals的差别

             this .name  =  name;

C#中==和equals的差别

        }

C#中==和equals的差别
C#中==和equals的差别

         public   override   bool  Equals( object  obj)

C#中==和equals的差别

         {

C#中==和equals的差别

             if  ( ! (obj  is  Person))

C#中==和equals的差别

                 return   false ;

C#中==和equals的差别

            Person per  =  (Person)obj;

C#中==和equals的差别

             return   this .Name  ==  per.Name;

C#中==和equals的差别

        }

C#中==和equals的差别

    }

C#中==和equals的差别

}

那麼p1.equals(p2),就會傳回true。

實際上,equals和==的實作基本相同。差别主要有:

1。equals調用者不能為null,equals(null)傳回false,但null==null傳回true.

2。equals是虛方法,可以實作多态,==不能多态,是以g==h和g.equals(h)傳回不同,因為string重寫了equals.

3。struct可以equals,采用的值類型比較方法;struct==struct回抛錯。