zoukankan      html  css  js  c++  java
  • .NET中各种相等

    方式  

    类别 

    类默认行为 

    原生 

     

    不同类型可否相 

    为是否能覆

    应用场

    Object.Equals

    静态方法

    调用Equals实例方法

    值相等

    各字段值相等

    参数可能为Null的情况

    Object.ReferenceEquals

    静态方法

    引用相等

    返回False

    返回False

    不可

    不可

    测试

     ==

    操作符

    引用相等

    值相等

    须定义后使用

    不可

    原生类型,简单业务逻辑

    Equals

    实例方法

    引用相等

    值和类型相等

    各字段值相等

    一般处理

    对于值类型,实现==操作像一个点缀,而如果想实现相等比较操作,应该优先重写Equals方法(同样若要实现大小比较,应该优先实现 IComparable接口,而不是实现比较操作符),从Object继承的Equals方法用于值类型时,比较两个对象的所有字段,全相等才为 True。要注意它据说用了反射,效率很低的。但是它低归低,为什么一定要优先重写它?

      因为所有.Net Framework键值集合,都是用Equals实例方法做比较的,所以它实际上成了.Net中的法定天平,无论是原生类型、结构或类的实例,都应以 Equals方法作为其标准的相等比较方式,包括我们自己实现的类型。用实例方法的好处也可以理解,更灵活,我们可以添加一些重载的Equals方法,申 明不同的比较前提条件。与重写的默认Equals方法配合,构成一套完整的比较规则,以符合现实里复杂多变的标准。

      重写Equals方法时,官方推荐重写GetHashCode方法,要是你不用此类型作键值集合键的话,其实无所谓。

      个别情况中,复杂到重载Equals方法也力不从心时,我们就要定义专门用来比较相等的功能类。.Net Framework已经提供了一个接口System.Collections.IEqualityComparer,并有几个内置的实现,如 StringComparer、EqualityComparer,我们自己写的比较类也不妨实现这个接口,当然,只要能用也不必计较那么多。看.Net Framework源代码,能发现好多个乱七八糟的类用于比较相等,大概是内部特权吧。

    截取部分  全文链接:http://www.cnblogs.com/XmNotes/archive/2011/06/23/2088341.html

  • 相关阅读:
    go语言浅析二叉树
    Go语言冒泡、选择、插入、快速排序实战浅析
    go语言教程之浅谈数组和切片的异同
    实测Maven上传jar包到私服的方法归纳
    干货|Dubbo社区开发者日经验分享
    Go语言系列开发之延迟调用和作用域
    mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)
    时间操作
    大型网站架构设计方向初探
    C#输入法
  • 原文地址:https://www.cnblogs.com/shikyoh/p/2088810.html
Copyright © 2011-2022 走看看