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;

    }

    }

  • 相关阅读:
    redis中save和bgsave区别
    go语言标准库
    numpy 学习:数组改变形状、副本和view
    Python 开始:变量、操作符、print()和type()
    numpy 学习:数据类型和空值
    Python 数据类型:布尔类型和None
    numpy 学习:数组的拼接、堆叠和拆分
    numpy 学习:数组的查找
    Databricks 第12篇:Notebook 工作流
    numpy 学习:通用函数(包含数学函数)
  • 原文地址:https://www.cnblogs.com/lbsong/p/1657086.html
Copyright © 2011-2022 走看看