曾英-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; } }