1. 程式人生 > >C#中equal與==的區別

C#中equal與==的區別

vat val ogr htm args 因此 ret 指向 和equal

C#中equal與==的區別

來源 https://www.cnblogs.com/dearbeans/p/5351695.html

C#中,判斷相等有兩種方式,一種是傳統的==操作,一種是object提供的Equals方法。二者的區別在於:

一、==操作符判斷的是堆棧中的值,Equlas判斷的是堆中的值。

C#提供值類型和引用類型,值類型存儲在棧上,故用==判斷是直接判斷其值是否相等,因為值類型不存在堆中的數據,因此值類型的Equals也是判斷數據。即,對於值類型而言,==與Equals相同,均是判斷其值是否相等。

對於引用類型而言,其棧中存儲的是對象的地址,那麽==就是比較兩個地址是否相等,即是否指向同一個對象;Equals函數則是比較兩個對象在堆中的數據是否一樣,即兩個引用類型是否是對同一個對象的引用。

二、String類型特殊

String類型雖然是引用類型,但是對String對象的賦值卻按照值類型操作。

例如:

String s1="hello";
String s2="hello";

對s2初始化的時候,並沒有重新開辟內存,而是直接將其地址指向s1的內容“hello”。這樣一來,string類型雖然是引用類型,但是其==操作和Equals操作都是一樣的,均比較值是否相等。

三、與GetHashCode()的關系

若兩對象Equals相等,那麽其GetHashCode()必定相等;但是反過來,若GetHashCode()相等,那麽這兩個對象Equals方法比較結果不一定相同。(為了獲取最佳性能,hash函數為對象內容生成的數字是隨機分布的,這就意味著,內容不同的對象,有可能生成的數字是一樣的,但可以認為這種概率非常小)。

下面示例說明:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class People
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public People(string name)
        {
            this.name = name;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string a = "hello";
            string b = new string(new char[] { ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘ });
            Console.WriteLine(a == b);
            Console.WriteLine(a.Equals(b));
            Console.WriteLine("\n");

            Int32 m = 3;
            Int32 n = 3;
            Console.WriteLine(n == m);
            Console.WriteLine(n.Equals(m));
            Console.WriteLine("\n");

            object g = a;
            object h = b;
            Console.WriteLine(g == h);
            Console.WriteLine(g.Equals(h));
            Console.WriteLine(g.GetHashCode() + "   " + h.GetHashCode());
            Console.WriteLine("\n");

            People p1 = new People("Jimmy");
            People p2 = new People("Jimmy");
            Console.WriteLine(p1 == p2);
            Console.WriteLine(p1.Equals(p2));
            Console.WriteLine(p1.GetHashCode() + "  " + p2.GetHashCode());
            Console.WriteLine("\n");

            People p3 = new People("Jimmy");
            People p4 = p3;
            Console.WriteLine(p3 == p4);
            Console.WriteLine(p3.Equals(p4));

        }
    }
}

運行結果如下:

True   True    True    True    False    True    -695839   -695839    False    False    46104728  12289376    True    True      請按任意鍵繼續. . .

在C#中,string 類型的特點有:

(1)屬於基本數據類型;

(2)是引用類型;

(3)只讀;

(4) string a="1123";

string b="1123";

那麽a和b指向同一個內存地址;

但是並非2個相同值相等的字符串就對應同一個內存地址;

(5)2個string 類型做“==”操作,先判斷內存地址是否相同,如果相同,則立即返回true;如果內存地址不相同,則繼續判斷值是否相同。

下面示例說明:

        static void Main(string[] args)
        {
            string a = new string(new char[] { ‘c‘, h‘, e‘,n‘, ‘1‘ });
            string b = new string(new char[] { ‘c‘, h‘, e‘,n‘, ‘1‘ });
            Console.WriteLine(a == b); //結果為true
            Console.WriteLine(a.Equals(b));//結果為true

            object g = a;
            object h = b;
            Console.WriteLine(g == h);//結果為false
            Console.WriteLine(g.Equals(h));//結果為true

            Person p1 = new Person("csw");
            Person p2 = new Person("csw");
            Console.WriteLine(p1 == p2);//結果為false
            Console.WriteLine(p1.Equals(p2));//結果為false


            Person p3 = new Person("csw");
            Person p4 = p3;
            Console.WriteLine(p3 == p4);//結果為true
            Console.WriteLine(p3.Equals(p4));//結果為true

            Console.ReadLine();
        }

========== End

C#中equal與==的區別