简单整型比较:
从这里可以看出整型比较无论是==和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