C# 区别对待==和Equals
2021-01-06 14:28
标签:div equal void class 一个 == code 操作符 设计 CLR中将“相等性”分为两类:“值相等性”和“引用相等性”。 值相等性:两个变量所包含的数值相等。 引用相等性:两个变量引用的是内存中的同一个对象。 无论是操作符“==”,还是方法“Equals()”,都倾向于表达这样一个原则: 对于值类型,如果类型的值相等,就应该返回true; 对于引用类型,如果类型指向同一个对象,则返回true。 例: 操作符“==”,还是方法“Equals()”,都是可以被重载的。比如string类型,它是一个特殊的引用类型,微软觉得它的现实意义更接近于值类型,所以,再FCL中,string的比较被重载为针对”类型的值“的比较,而不是”引用本身“的比较。 例: 从设计上来说,很多自定义类型(尤其是自定义的引用类型)会存在和string类型比较接近的情况。如第一个例子中的Person类,再现实生活中,如果两个人的ID是相等的,我们就会认为两者是同一个人,这个时候就要重载Equals方法了: 这时再去比较两个具有相同ID的Person对象的值就会返回true: 此时,对于该类,可以用==判断两个实例是否为指向同一个对象,用Equals方法判断两个实例的值是否相等。 注意:FCL中提供了Object.ReferenceEquals方法来明确肯定是比较”引用相等性“。 参考:《编写高质量代码改善C#程序的157个建议》陆敏技 C# 区别对待==和Equals 标签:div equal void class 一个 == code 操作符 设计 原文地址:https://www.cnblogs.com/xuyouyou/p/13168783.html
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int i = 1;
6 int j = 1;
7 Console.WriteLine(i == j); //true
8 Console.WriteLine(i.Equals(j)); //true
9 j = i;
10 Console.WriteLine(i == j); //true
11 Console.WriteLine(i.Equals(j)); //true
12
13 object a = new Person(1);
14 object b = new Person(1);
15 Console.WriteLine(a == b); //false
16 Console.WriteLine(a.Equals(b)); //false
17 b = a;
18 Console.WriteLine(a == b); //true
19 Console.WriteLine(a.Equals(b)); //true
20 Console.Read();
21 }
22 }
23
24 class Person
25 {
26 public int ID { get; set; }
27 public Person(int value)
28 {
29 ID = value;
30 }
31 }
1 string s1 = "aa";
2 string s2 = "aa";
3 Console.WriteLine(s1 == s2); //true
4 Console.WriteLine(s1.Equals(s2)); //true
5 s2 = s1;
6 Console.WriteLine(s1 == s2); //true
7 Console.WriteLine(s1.Equals(s2)); //true
1 class Person
2 {
3 public int ID { get; set; }
4 public Person(int value)
5 {
6 ID = value;
7 }
8 //重写Object.Equals(object o)
9 public override bool Equals(object obj)
10 {
11 return ID == (obj as Person).ID;
12 }
13 }
1 object a = new Person(1);
2 object b = new Person(1);
3 Console.WriteLine(a == b); //false
4 Console.WriteLine(a.Equals(b)); //true