Person p1= new Person(); Person p2=new Person(); p1和p2不为同一对象,因为它们的堆地址不同,使用不同的堆内存空间 Person p3 =p1; //比较两个对象是否为同一个对象 Console.WriteLine(object.ReferenceEquals(p1,p2)); 比较p1,p2是否为同一对象,输出为false. Console.WriteLine(object.ReferenceEquals(p1,p3)); 比较p1,p3是否为同一对象,输出为true. Console.WriteLine(p1==p2); 比较p1,p2是否为同一对象,输出为false. Console.WriteLine(p1.Equals(p2)); 比较p1,p2是否为同一对象,输出为false.
若赋值:p1=p2; Console.WriteLine(p1==p2); 比较p1,p2是否为同一对象,输出为true. Console.WriteLine(p1.Equals(p2)); 比较p1,p2是否为同一对象,输出为true. Console.WriteLine(object.ReferenceEquals(p1,p2)); 比较p1,p2是否为同一对象,输出为true.
string s1=“abc”; string s2=“abc”;// Console.WriteLine(s1==s2); 比较s1,s2是否为同一对象,输出为true. Console.WriteLine(s1.Equals(s2)); 比较s1,s2是否为同一对象,输出为true. Console.WriteLine(object.ReferenceEquals(s1,s2)); 比较s1,s2是否为同一对象,输出为true.
//s1和s2是两个不同的对象,因为new了两次,在堆中确实存在两块不同的内存。 string s1= new string(new char [ ] {‘a’,‘b’,‘c’ } ) string s2= new string(new char [ ] {‘a’,‘b’,‘c’ } ) Console.WriteLine(s1==s2); 比较s1,s2是否为同一对象,输出为true. Console.WriteLine(s1.Equals(s2)); 比较s1,s2是否为同一对象,输出为true. Console.WriteLine(object.ReferenceEquals(s1,s2)); 比较s1,s2是否为同一对象,输出为false. //总结1:使用object.ReferenceEquals()可以始终准确验证两个变量是否为同一对象
//对于字符串类型来说,重载了Equals()方法,在这个重载方法中其实是判断两个字符串中的字符是否完全一样,如果一样就返回true,并不是判断两个对象是否为同一对象。
//而且字符串类也重写object类中的Equals方法,在该方法中也是判断的两个字符串中的字符是否完全一样,如果一样就返回true,并不是判断这两个对象是否为同一对象。
//在字符串类中,有一个操作符重载,对==这个操作符进行了重载,在该重载函数中也是对字符的内容作了判断,所以 == 表现出了与Equals()同样的效果。
所以 == 和Equals相同 ,只判断字符串内容是否一样,不判断是否为同一对象(堆地址相同) object.ReferenceEquals()判断它们的堆地址是否相同,相同才是同一对象。 当判断两个是否为同一对象时,用Console.WriteLine(object.ReferenceEquals(s1,s2)); 来判断!!