== Equals ReferenceEquals 比较

== 为操作符

 ReferenceEquals和Equals为函数

=========================================================

ReferenceEquals用于比较引用类型的引用是是否指向同一个对象。它只能比较引用类型。当把值类型传给它的时候永远都会返回false,因为值类型作为参数的时候首先会装箱,经过装箱的值类型哪怕是指相等,但是也是两个不同的对象,所以变量是指向不同的对象,所以永远返回false。

例如:

1 int x = 10; 
2 int y = 10; 
3 bool b1 = object.ReferenceEquals(x,y); 

结果肯定是返回false,但是如果是比较引用类型,如果是两个引用指向同一个对象,则为true。

再例如:

 1  public class Person
 2     {
 3         public string PersonId { get; set; }
 4         public string FirstName { get; set; }
 5         public string LastName { get; set; }
 6     }
 7     class Program
 8     {
 9 
10         static void Main(string[] args)
11         {
12             Person person1 = new Person {PersonId = "1", FirstName = "Qu", LastName = "Geng"};
13             Person person2 = new Person { PersonId = "2", FirstName = "Qu2", LastName = "Geng2" };
14             Person person3 = person2;
15             bool br1 = object.ReferenceEquals(person1, person2);
16             bool br2 = object.ReferenceEquals(person2, person3);
17             Console.WriteLine(br1);
18             Console.WriteLine(br2);
19             Console.ReadKey();
20         }
21     }

我们可以发现第一个返回false,第二个返回true。那么如果其中有一个对象为null,或者两个对象都为null呢?结果会为false,如果两个都为null呢?结果为true。他们不会引发异常。

Equals

实例Equals算是比较复杂的一个比较方法。实例Equals可以比较引用是否指向同一个对象,同时可以按值来比较对象。如果要按值比较对象,我们就需要重载Equals对象来实现我们的比较逻辑。同时Equals默认也支持比较值类型的相等。那么我们该怎么重载Equals来让对象具有值相等性的比较呢?

它返回true有三种情况:

1,引用指向同一个对象

2,比较两个null

3,重载了Equals的实例方法返回true

==运算符

==号运算符其实跟实例的Equals没有多大的区别,==是运算符,而Equals是方法。他们都可以重写。默认都能比较引用和比较值。关于==的重载可以参考运算符一文中的运算符重载。

总结他们的区别:

ReferenceEquals:静态方法,不能重写,只能比较引用,如果有一个参数为null会返回false,不会抛出异常,如果比较值类型,则始终返回false。

Equals:实例方法,默认可以比较引用也可以比较值,可以重写。可以按值比较对象。

静态Equals:静态方法,不能重写。如果没有重写Equals,比较引用,或者比较值。如果重载了Equals方法。比较引用,或者比较值,或者按重写的Equals比较,如果其中一个参数为null,抛出异常

==运算符:可以按引用比较,也可以按值比较。可以重写。是操作运算符。

最后需要的是,如果重载了Equals,则最好是重载GetHashCode,必须重载==运算符。

原文地址:https://www.cnblogs.com/QQ931697811/p/4330674.html