教學-45 對象的相等

曾英-C#教學-45 對象的相等編程

目錄

  • 四種比較對象的編程方法
  • 學會重寫Equals方法
  • 理解對象的相等

1\對象的相等

  • ReferenceEquals()使用注意點:ide

    • 它是靜態方法,須要用類來引用
    • 返回的是bool量
    • 表示的是兩個引用符是否指向的是同一個對象
  • 實例Equals()方法注意點:this

    • 它是虛方法,能夠重寫,能夠重寫來實現值的比較,
  • 靜態Equals()方法:

  • ==:spa

image

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;
        }
    }
相關文章
相關標籤/搜索