• 对象的判等


    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;

    }

    }

  • 相关阅读:
    如果经常访问国外站
    CouchDB降临Android
    ubuntu server操作流程百岁版
    开源HTML解析工具包jsoup 1.3.1发布
    LEMP aka LNMP
    VC编译选项
    gae地址
    feedparser 同步博客园rss到 qq zone
    跨系统共享键盘鼠标利器分享:synergy
    支持ff,ie的回车提交
  • 原文地址:https://www.cnblogs.com/lbsong/p/1657086.html
Copyright © 2020-2023  润新知