C#對象比較的總結
簡單整型比較:
從這里可以看出整型比較無論是==和Equals方法都是進行比較,比較“正常”
int m1 = 2; int m2 = 2; Console.WriteLine(m1 == m2);//值比較True Console.WriteLine(m1.Equals(m2));//值比較True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
object比較:
類型如果是Object,進行==比較時判斷的是地址是否相同,而Equals則是其虛方法判斷值是否正常
object m1 = 2; object m2 = 2; Console.WriteLine(m1 == m2);//引用類型引用比較False Console.WriteLine(m1.Equals(m2));//Object虛方法值比較True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
整型賦值比較:
這個就類似淺拷貝
int m1 = 3434; int m2 = m1; Console.WriteLine(m1 == m2);//值比較True Console.WriteLine(m1.Equals(m2));//值比較True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用比較False
object和其他值類型比較:
object m1 = 2; int m2 = 2; Console.WriteLine(m1.Equals(m2));//Object虛方法值比較True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
字符串類型比較:
字符串雖然是引用類型,但是C#對其做有特殊優化,從下面的結果就可以看出,==和Equals比較的是字符串內容相同,而字符串內容相同的兩個變量引用也相同,是經過運行時優化了的。
string m1 = "tg903eiotf38"; string m2 = "tg903eiotf38"; Console.WriteLine(m1 == m2);//字符串值比較True Console.WriteLine(m1.Equals(m2));//字符串值比較True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//字符串引用優化比較True
現有一class:
public class Student { public long Id { get; set; } public string Name { get; set; } }
引用類型比較:
簡單的引用類型,==和Equals比較的是都是地址引用
Student m1 = new Student() { Id = 34, Name = "朝野布告", }; Student m2 = new Student() { Id = 34, Name = "朝野布告", }; Console.WriteLine(m1 == m2);//False Console.WriteLine(m1.Equals(m2));//False Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
Student m1 = new Student() { Id = 34, Name = "朝野布告", }; Student m2 = m1; Console.WriteLine(m1 == m2);//True Console.WriteLine(m1.Equals(m2));//True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
引用類型賦值比較:
類似淺拷貝
Student m1 = new Student() { Id = 34, Name = "朝野布告", }; Student m2 = m1; m1.Name = "颶風"; Console.WriteLine(m1 == m2);//True Console.WriteLine(m1.Equals(m2));//True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True Console.WriteLine(m1.Name);//颶風 Console.WriteLine(m2.Name);//颶風
object m1 = new Student() { Id = 34, Name = "朝野布告", }; object m2 = m1; Console.WriteLine(m1 == m2);//True Console.WriteLine(m1.Equals(m2));//True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
匿名類型比較:
匿名類型==比較的是地址的引用,而哈希碼的生成看的是每個數據成員的值,因此其全部值一樣則哈希碼一樣,Equals判斷也一樣的道理
var m1 = new { Id = 34, Name = "朝野布告" }; var m2 = new { Id = 34, Name = "朝野布告" }; Console.WriteLine(m1 == m2);//False Console.WriteLine(m1.GetHashCode());//32076894 Console.WriteLine(m2.GetHashCode());//32076894 Console.WriteLine(m1.Equals(m2));//True Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
原創作者:http://www.rzrgm.cn/huangsheng/

浙公網安備 33010602011771號