1. 程式人生 > >相等性比較 (== ,Equals,ReferenceEquals)

相等性比較 (== ,Equals,ReferenceEquals)

明顯 應該 font == turn 否則 由於 else bsp

1.前言

在C#中存在三種比較對象相等性的方法,== ,Equals,以及 ReferenceEquals,對於這三種不同形式的相等性比較,他們又存在著那些差異呢?

2.比較形式

在C#中存在著兩種比較形式,即引用相等的比較和值相等的比較。對於值類型和引用類型,兩者在進行比較時的內容也是不同的。

  • 值類型的比較:比較兩個值類型所包含的數值是否相等
  • 引用類型的比較:引用類型的比較分為兩部分,一個是引用類型的引用是否一致(存放在堆棧中),另一個是引用類型的數值是否一致(存放在托管堆)。因此,對於引用類型存在兩種形式的比較

在默認情況下,對值類型進行數值比較,對引用類型進行引用比較。

3.三種比較的詳細分析

3.1 ==(相等運算符)

有關 == 的使用主要可以分為三種情況:

  1. 對值類型:如果其操作數的值相等,則相等運算符 (==) 返回 true,否則返回 False。
  2. 對 string 外的引用類型,如果兩個操作數引用同一對象,則==會返回 true。
  3. 對 string 類型,==會比較字符串的值。這是由於 string 是微軟封裝的一個字符串類,在內部他已經對 == 操作符進行了重寫,重寫後比較的則是兩個變量的內容是否相同。
class Test
{ }
class Program
{
    static void Main(string[] args)
    {
        
int a = 1; int b = 1; Test A = new Test(); Test B = A; string c = "qwer"; string d = "qwer"; Console.WriteLine(a == b); Console.WriteLine(A == B); Console.WriteLine(c == d); Console.WriteLine((2 + 2) == 4); Console.ReadKey(); } }

輸出結果如下:

True
True
True
True

3.2 Equals

有關 Equals 的使用主要可以分為三種情況:

  1. 對值類型:作用與 == 運算符相同,對兩者的數值進行比較
  2. 對 string 外的引用類型,Equals 比較的永遠是變量的內容是否相同但必須對 Object 中的 Equals 實現重寫
  3. 對 string 類型:作用與 == 運算符相同,對字符串的值進行比較
class Test
{
    string name;
    public Test(string name)
    {
        this.name = name;
    }
}
class Program
{
    static void Main(string[] args)
    {
        int a = 1;
        int b = 1;
        Test A = new Test("kyle");
        Test B = new Test("kyle");
        string c = "qwer";
        string d = "qwer";
        Console.WriteLine(a.Equals(b));
        Console.WriteLine(A.Equals(B));
        Console.WriteLine(c.Equals(d));
        Console.WriteLine((2+2).Equals(4));
        Console.ReadKey();
    }
}

輸出結果如下:

True
False
True
True

Equals 始終實現的是對值的比較,明顯對象 A,B 的值是相等的,但 A.Equals(B) 的輸出結果確實 False,這是因為 Equals 是 Object 中的一個虛方法,而 Test 類中沒有對其進行重寫,因此此時調用的仍是父類中的 Equals 方法。但是父類是無法知道 Test 的成員字段,因此返回的是 false。因此想要比較兩個變量的內容是否相同,那就應該重寫 Equals 方法。

public override bool Equals(object obj)
{
    Person t = obj as Person;
    if(this.name == t.name)
    {
        return true;
    }
    else
    {
        return false;
    }
}

3.3 ReferenceEquals

ReferenceEquals 是 Object 中的靜態方法,對於值類型或者引用類型都是用來檢查引用是否相同

  1. 由於檢查引用是否相同,所以對值類型始終返回 False
  2. 對於引用類型,當可兩者引用相同時返回 True
class Person
{
    string name;
    public Person(string name)
    {
        this.name = name;
    }

    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 1;
            Person A = new Person("kyle");
            Person B = new Person("kyle");
            Person C = B;
            Console.WriteLine(ReferenceEquals(a, b));
            Console.WriteLine(ReferenceEquals(A, B));
            Console.WriteLine(ReferenceEquals(B, C));
            Console.ReadKey();
        }
    }
}

輸出結果如下:

False
False
True

相等性比較 (== ,Equals,ReferenceEquals)