zoukankan      html  css  js  c++  java
  • 对象的判等

    1. ==操作符

    两个引用类型的对象(类型继承自System.Object),当使用==操作符来判断是不是相等时,编译器总是生成判断这两个对象的引用是不是相同的中间代码IL。因此==操作符对于两个引用类型的对象而言是等价于静态方法 Object.ReferenceEquals(Object objA, Object objB)的,但为了语义更加清晰,我们应该使用Object.ReferenceEquals方法来明确地表达代码的目的是为了判断两个对象是不是引用相同

    2. 静态方法 Object.Equals(object left, object right)

    这个方法首先通过==操作符来判断两个对象是不是引用相等,是则返回true,然后判断两个对象是不是有null,有就返回false,最后调用对象实例的Equals方法来判断是不是相等,代码如下:

    public static bool Equals(object left, object right)

    {

      if (left == right)

      return true;

    if (left == null || right == null)

    return false;

    return left.Equals(right);

    }

    3. 实例方法Equals(object right)

    在System.Object类中,实例方法 Equals被声明为虚方法,因此是可以被继承类override的。如果不override这个方法,那么它的行为跟ReferenceEquals完全一样。当我们自己声明的类对象,判等的语义要求不是引用相同时,就需要override这个实例方法,来实现我们自己的语义,比如:

    class A

    {

    public string Name {get; set;}

    public override bool Equals(object right)

    {

    //引用相同就认为是相等的

      if (Object.ReferenceEquals(right))

    {

    return true;

    }

    //因为this肯定不是null,所以right是null的话,一定不等

    if (right == null)

    {

      return false;

    }

    //这里我们实现了语义为:只要两个对象的Name属性相等,我们就认为这两个对象相等(尽管我还没看见过这样怪异的需求)

    if (this.Name == right.Name)

    {

    return true;

    }

    return false;

    }

    }

  • 相关阅读:
    Anaconda设置虚拟环境并打包exe
    [转]Anaconda, conda, pyenv, virtualenv的区别
    [闲记]2020-2-13
    集合笔记
    Python_列表(list)
    LeetCode 1711. 大餐计数 做题小结
    LeetCode 242. 有效的字母异位词 做题小结
    GitHub Actions教程 使用selenium自动化
    LeetCode 5641. 卡车上的最大单元数 做题小结
    git 批量删除文件夹和文件
  • 原文地址:https://www.cnblogs.com/lbsong/p/1657086.html
Copyright © 2011-2022 走看看