相等性比較 (== ,Equals,ReferenceEquals)
阿新 • • 發佈:2018-10-18
明顯 應該 font == turn 否則 由於 else bsp 3.三種比較的詳細分析
1.前言
在C#中存在三種比較對象相等性的方法,== ,Equals,以及 ReferenceEquals,對於這三種不同形式的相等性比較,他們又存在著那些差異呢?
2.比較形式
在C#中存在著兩種比較形式,即引用相等的比較和值相等的比較。對於值類型和引用類型,兩者在進行比較時的內容也是不同的。
- 值類型的比較:比較兩個值類型所包含的數值是否相等
- 引用類型的比較:引用類型的比較分為兩部分,一個是引用類型的引用是否一致(存放在堆棧中),另一個是引用類型的數值是否一致(存放在托管堆)。因此,對於引用類型存在兩種形式的比較
在默認情況下,對值類型進行數值比較,對引用類型進行引用比較。
3.三種比較的詳細分析
3.1 ==(相等運算符)
有關 == 的使用主要可以分為三種情況:
- 對值類型:如果其操作數的值相等,則相等運算符 (
==
) 返回 true,否則返回 False。 - 對 string 外的引用類型,如果兩個操作數引用同一對象,則
==
會返回 true。 - 對 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 的使用主要可以分為三種情況:
- 對值類型:作用與 == 運算符相同,對兩者的數值進行比較
- 對 string 外的引用類型,Equals 比較的永遠是變量的內容是否相同
,
但必須對 Object 中的 Equals 實現重寫
。 - 對 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 中的靜態方法,對於值類型或者引用類型都是用來檢查引用是否相同
- 由於檢查引用是否相同,所以對值類型始終返回 False
- 對於引用類型,當可兩者引用相同時返回 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)