C# 中 ==和equals的區別


不想說太多,直接上代碼,這兩個就沒什么聯系,有自己獨立的規則。聯系在一起其實不利於記憶。

下面是測試代碼

            Console.WriteLine("--equals和==的區別--"); Console.WriteLine("1、對於值類型的數據"); Console.WriteLine(); Console.WriteLine("1.1、類型和數學上的值都相同的數"); Console.WriteLine($"(int)1 == (int)1 的結果是:{(int)1 == (int)1}"); Console.WriteLine($"(int)1).Equals((int)1) 的結果是:{((int)1).Equals((int)1)}"); Console.WriteLine("1.2、對於類型不同但是數學上值相同的數"); Console.WriteLine($"(int)1 == (long)1 的結果是:{(int)1 == (long)1}"); Console.WriteLine($"(int)1 == (double)1 的結果是:{(int)1 == (double)1}"); Console.WriteLine($"(int)1 == (double)1.0 的結果是:{(int)1 == (double)1.0}"); Console.WriteLine($"(int)1 == (decimal)1 的結果是:{(int)1 == (decimal)1}"); Console.WriteLine($"(int)1 == (decimal)1.0 的結果是:{(int)1 == (decimal)1.0}"); Console.WriteLine($"((int)1).Equals((long)1 的結果是:{((int)1).Equals((long)1)}"); Console.WriteLine(); Console.WriteLine("2、對於引用類型的數據"); Console.WriteLine(); Console.WriteLine("2.1、在1.1的基礎上轉化為object再比較"); Console.WriteLine($"(object)(int)1 == (object)(int)1 的結果是:{(object)(int)1 == (object)(int)1}"); Console.WriteLine($"((object)(int)1).Equals((object)(int)1 的結果是:{((object)(int)1).Equals((object)(int)1)}"); Console.WriteLine(); Console.WriteLine("2.2、在1.2的基礎上轉化為object再比較"); Console.WriteLine($"(object)(int)1 == (object)(long)1 的結果是:{(object)(int)1 == (object)(long)1}"); Console.WriteLine($"((object)(int)1).Equals((object)(long)1 的結果是:{((object)(int)1).Equals((object)(long)1)}"); Console.WriteLine(); Console.ReadKey();

 

打印如下:

--equals和==的區別--
1、對於值類型的數據

1.1、類型和數學上的值都相同的數
(int)1 == (int)1 的結果是:True
(int)1).Equals((int)1) 的結果是:True
1.2、對於類型不同但是數學上值相同的數
(int)1 == (long)1 的結果是:True
(int)1 == (double)1 的結果是:True
(int)1 == (double)1.0 的結果是:True
(int)1 == (decimal)1 的結果是:True
(int)1 == (decimal)1.0 的結果是:True
((int)1).Equals((long)1 的結果是:False

2、對於引用類型的數據

2.1、在1.1的基礎上轉化為object再比較
(object)(int)1 == (object)(int)1 的結果是:False
((object)(int)1).Equals((object)(int)1 的結果是:True

2.2、在1.2的基礎上轉化為object再比較
(object)(int)1 == (object)(long)1 的結果是:False
((object)(int)1).Equals((object)(long)1 的結果是:False

 

 

還是給個說明吧:

Equals具體的用發應該看類型自己的實現。

對於int型的比較代碼是這樣定義的:如果比較的是int型,返回使用==比較的結果;如果不是,先判斷是不是int型,不是直接返回false,是再返回使用==比較的結果。

int 的Equals方法只支持int和object兩種,如果傳入其他類型,會自動轉化為object。如((int)1).Equals((long)1 等價於 ((int)1).Equals((object)(long)1

 [__DynamicallyInvokable] public override bool Equals(object obj) { if (!(obj is int)) { return false; } return this == (int)obj; } [NonVersionable] [__DynamicallyInvokable] public bool Equals(int obj) { return this == obj; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM