教学-45 对象的相等

曾英-C#教学-45 对象的相等

目录

  • 四种比较对象的编程方法
  • 学会重写Equals方法
  • 理解对象的相等

1\对象的相等

  • ReferenceEquals()使用注意点:

    • 它是静态方法,需要用类来引用
    • 返回的是bool量
    • 表示的是两个引用符是否指向的是同一个对象
  • 实例Equals()方法注意点:

    • 它是虚方法,可以重写,可以重写来实现值的比较,
  • 静态Equals()方法:

  • ==:

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

  

posted @ 2018-02-01 22:46  泮聪  阅读(168)  评论(0编辑  收藏  举报