曾英-C#教学-45 对象的相等
目录
- 四种比较对象的编程方法
- 学会重写Equals方法
- 理解对象的相等
1\对象的相等
-
ReferenceEquals()使用注意点:
- 它是静态方法,需要用类来引用
- 返回的是bool量
- 表示的是两个引用符是否指向的是同一个对象
-
实例Equals()方法注意点:
- 它是虚方法,可以重写,可以重写来实现值的比较,
-
静态Equals()方法:
-
==:
1.1\ ReferenceEquals(f1, f2)方法实现:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _45_对象的相等 { class Program { static void Main(string[] args) { Cde f1 = new Cde(2); Cde f2 = new Cde(2); Console.WriteLine(Cde.ReferenceEquals(f1, f2)); //由于所有的类都继承了Object类,所以这里在静态类调用的时候可以去掉"Cde." //Console.WriteLine(ReferenceEquals(f1, f2)); //这样引用也是可以的 } } class Cde { int a; public Cde(int b) { a = b; } } } 输出结果: false 理由:f1和f2指向的不是相同的地址
1.2\ 实例Equals方法的实现
class Program { static void Main(string[] args) { Cde f1 = new Cde(2); Cde f2 = new Cde(2); Console.WriteLine(f1.Equals(f2)); //f1是个对象,用对象对实例方法的引用 } } class Cde { int a; public Cde(int b) { a = b; } } 结果:false
1.3\静态Equals方法的实现
class Program { static void Main(string[] args) { Cde f1 = new Cde(2); Cde f2 = new Cde(2); Console.WriteLine(Equals(f1, f2)); /* Console.WriteLine(Cde.Equals(f1, f2)); 这样也是可以的 */ } } class Cde { int a; public Cde(int b) { a = b; } } 结果:false
1.4\ ==的实现:
class Program { static void Main(string[] args) { Cde f1 = new Cde(2); Cde f2 = new Cde(2); Console.WriteLine(f1==f2); } } class Cde { int a; public Cde(int b) { a = b; } } 结果:false
1.5\要让结果为真的方法:
- 这里,将f1的地址值赋值给f2,都指向了同一个地址,那么他们就是相等的了
class Program { static void Main(string[] args) { Cde f1 = new Cde(2); //这里是关键 Cde f2 = f1; Console.WriteLine(f1==f2); f1.a = 43; f2.a = 22; Console.WriteLine(Equals(f1,f2)); //输出结果还是真,此时,f1 Console.WriteLine(f1.a); //输出结果是22, //因为没有为f2重新分配新的地址栈 } } class Cde { int a; public Cde(int b) { a = b; } } 结果:TRue 理由:指向同一个地址
1.6\实例Equals()虚方法的重写:
class Program { static void Main(string[] args) { Cde f1 = new Cde(2); Cde f2 = new Cde(2); //f1.a = 2; f2.a = 2; Console.WriteLine(f1.Equals(f2)); Console.WriteLine(f1.a); } } class Cde { public int a; public Cde(int b) { a = b; } //重写虚方法 //方法逻辑:只判断属性的值是否相等,不判断地址是否相同 public override bool Equals(object obj)//这里括号中的参数不能修改 { //避免程序出错 //加入obj为空或者obj类型不等于cde的类型,那么返回假,避免别的程序出错 if ((obj == null) || (obj.GetType() != typeof(Cde))) return false; Cde f3 = (Cde)obj;//强制类型转换 if (f3.a == this.a) return true;//f3的a与对象f1的a进行比较,因为是用f1来调用equals的方法. else return false; } }