曾英-C#教学-45 对象的相等编程
ReferenceEquals()使用注意点:ide
实例Equals()方法注意点:this
==:spa
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指向的不是相同的地址
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
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
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
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 理由:指向同一个地址
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; } }