• 对象的判等


    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;

    }

    }

  • 相关阅读:
    我的友情链接
    我的友情链接
    BUMO:超级节点共建接口
    OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
    零知识证明: 抛砖引玉
    比特币原理
    区块链零知识证明:STARKs,Part-3:攻坚(下)
    什么是zkSNARKs:谜一般的“月亮数学”加密,Part-1
    什么是zkSNARKs:谜一般的“月亮数学”加密,Part-2
    STARKs, Part I: 多项式证明
  • 原文地址:https://www.cnblogs.com/lbsong/p/1657086.html
Copyright © 2020-2023  润新知