.NET类型对象的判等(Equals)

车载Android USB开发实战:突破四层隔离墙的串口/CAN/HID集成指南 USB Host模式是Android车载系统接入外部硬件的基础能力,其本质是Linux内核USB子系统在Host控制器上的运行态;车载场景下需绕过SELinux策略限制、HAL层设备白名单过滤及CarService权限绑定机制,才能实现稳定可靠的USB串口通信、USB-CAN总线交互与HID人机输入映射;该技术广泛应用于OBD诊断、T-Box固件升级、数字钥匙双模认证及Android Auto数据桥接等车规级功能模块;本文聚焦高通/瑞萨/NXP等主流车规平台的真实联调路径,覆盖从内核驱动加载、HAL配置、F 阅读详情

申明::本文内容来自<<.NET框架程序设计>>
    .NET类型分为:基元类型(Primitive type),引用类型(Reference type),值类型(Value type),所有这些
类型的祖先是System.Object,System.Object提供了四个成员函数:Equals GetHashCode GetType ToString ,以确保每个继承类型都有一个最小的操作集合,但是在我们设计.NET类型的时候,这些成员的实现不能满足我们的需要,比如System.Object.Equals的默认实现就只是对两个比较的对象进行引用判等(确定指定的 Object 实例是否是相同的实例),即ReferenceEquals,所以,为我们自己的类型提供这些操作的重写是必须的,这样才能确保我们的类型如我们的期待运行,下面对重写Equals进行讨论.


1.引用类型
<1>类型(这里指我们自己设计的类型)直接派生自System.Object或者类型的所有基类均没有提供了非System.Object.Equals的实现

public class MyObject : object
{
  public int m_id;
  public string m_name;

  public MyObject(){}

  public override bool Equals(object obj)
  {
    if(obj==null)
      return false;
    if(obj.GetType()!=this.GetType())
      return false;
    MyObject other = (MyObject)obj;

    //比较值类型字段,使用值类型本身的Equals方法
    if(!m_id.Equals(other.m_id))
      return false;

    //比较引用类型字段,使用Object.Equals方法
    if(!Object.Equals(this.m_name,other.m_name))
      return false;

    return true;
  }
  
  public static bool operator==(MyObject o1,MyObject o2){
   return Object.Equals(o1,o2);
  }

  public static bool operator!=(MyObject o1,MyObject o2){
   return !Object.Equals(o1,o2);
  }
 }

看看Object.Equals(object objA,object objB)的实现,上面对引用类型字段的比较和==操作符号的重载用到了它,他的实现就是如果指向同一实体为真,任意为空为假,接下来才调用比较类型本身的判等方法,这样的效率显然更高。

public static bool Equals(object objA,object objB){
  if(objA==objB) reurn true;
  if((objA==null)||(objB==null)) return false;
  return
objA.Equals(objB);
}


<2>类型的基类提供了非System.Object.Equals的实现
public class MyObjectEx: MyObject
{
  public int m_idEx;
  public string m_nameEx;
  public MyObjectEx(){ }
   
  public override bool Equals(object obj)
  {
    if(!base.Equals(obj))
      return false;

    if(obj==null)
      return false;
    if(obj.GetType()!=this.GetType())
      return false;
    MyObjectEx other = (MyObjectEx)obj;

    if(!m_idEx.Equals(other.m_idEx))
      return false;

    if(!Object.Equals(this.m_nameEx,other.m_nameEx))
      return false;

    return true;
  }

  public static bool operator==(MyObjectEx o1,MyObjectEx o2){
   return Object.Equals(o1,o2);
  }

  public static bool operator!=(MyObjectEx o1,MyObjectEx o2){
   return !Object.Equals(o1,o2);
  }
}

这里不同的只是多了

if(!base.Equals(obj))
      return false;

很好理解,调用基类型的Equals实现,比较基类字段是否相等,如果这都不等,类型就不可能相等了.


2.值类型的Equals重写

首先要知道值类型都派生自System.ValueType,而System.ValueType又是派生自System.Object,我们先看看ValueType的Equals实现
public class ValueType
{
  public override bool Equals(object obj)
  {
    if(obj==null)
      return false;
    Type thisType = this.GetType();
    if(thisType!=obj.GetType())
      return false;
    FieldInfo[] fields = thisType.GetFields(BindingFlags.Public | 
                  BindingFlags.NonPublic | BindingFlags.Instance);
    for(int i=0; i<fields.Length; i++)
    {
      object thisValue = fields[i].GetValue(this);
      object thatValue = fields[i].GetValue(obj);
      if(!Object.Equals(thisValue,thatValue))
        return false;
    }
    return true;
  }
}

这里用到了反射类System.Reflection,用来获取每个进行比较的类型的所有字段信息,以便对每个字段值进行比较.下面继续我们的值类型Equals方法重写
struct MyValueType : ValueType
{
  public string m_refType;
  public int m_valType;
  public override bool Equals(object obj){
    if(!(obj is MyValueType))
      return false;
    return this.Equals((ValueType)obj);
  }

  public bool Equals(MyValueType obj){
    if(!Object.Equals(this.m_refType,obj.m_refType))
      return false;
    if(!this.m_valType.Equals(obj.m_valType))
      return false;
    return true;
  }

  public static bool operator==(MyValueType v1,MyValueType v2)
  {
    return v1.Equals(v2);
  }

  public static bool operator!=(MyValueType v1,MyValueType v2){
    return !v1.Equals(v2);
  }
}
这里,对我们的值类型的Equals进行了重写,原书作者是说“尽管ValueType的Equals实现已经提供了一个很好的操作,并且适合绝大多数类型,但是我们仍然提供自己的Equals实现,原因是我们的实现效率更高,并且可以避免很多装箱操作”然而书的译者却否定了这个说法,他说不应该提供这样的重写,原因是这个重写有危险,传入的参数类型可能是一个可以隐式转化为MyValueType的类型,如:

if(myvaluetype.Equals(theothertype))

这样在调用的时候,首先theothertype进行的隐式转化为MyValueType,这就把theothertype的实际类型改了,因为对theothertype的隐式转化得到的肯定是MyValueType类型,这样调用的就是我们的public bool Equals(MyValueType obj),即使类型不同,字段值相同,也会得到true,这不是我们所期望的,所以这点还是佩服译者,考虑的深刻,能发现大师的错误。所以,对于值类型的Equals,我们还是不对其进行重写,就使用值类型基类ValueType提供的Equals,进行判等,它已经能满足我们的要求!但是如果确实对程序性能要求很严格,不妨我们对上面的做点修改:

public override bool Equals(object obj)
{
  if(!(obj is MyValueType))
    return false;
  MyValueType other = (MyValueType)obj;               
  if(!Object.Equals(this.m_refType,other.m_refType))
    return false;
  if(!this.m_valType.Equals(other.m_valType))
    return false;
  return true;
}

这样减少了使用反射,但也不能避免调用的时候对参数的装箱操作,不过也稍微提高了一些性能,也如译者所提及的,不管是引用类型还是值类型,不要提供强类型版本的Equals判等.

.Net判断一个对象是否为数值类型实例 本文实例讲述了.Net判断一个对象是否为数值类型的方法,分享给大家供大家参考。具体实现方法如下: .Net判断一个对象是否为数值类型乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉。 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断。 老外给出的方法是: 代码如下:public static bool IsNumeric(this Type dataType) {         if (dataType == null)             throw new ArgumentNullExcep 立即下载

相关推荐

CanOpen PDO映射实战:从原理到配置的完整指南

本文详细解析了CanOpen PDO映射的原理与配置流程,从基础通信机制到实战配置步骤,涵盖禁用PDO、清空映射、逐项映射和使能PDO等关键环节。特别针对西门子G120变频器、台达伺服和倍福CX控制器等不同厂商设备,提供了具体的配置技巧和常见问题排查指南,帮助工程师快速掌握多厂商设备间的PDO通信配置。

weixin_30718391的博客 516

.net高级技术——关于相等(Equals)

1.我们使用Object的ReferenceEquals方法来判断两个实列是否时相同的对象 class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Age = 12; p1....

qq_33407246的博客 747

无人机开发平台全解析:从开源飞控到企业级应用实战指南

无人机开发平台是无人机从飞行器演变为智能空中机器人的核心,其本质是提供了一套标准化的软硬件接口与工具链,使开发者能够基于稳定可靠的底层系统,专注于上层应用创新。从技术原理上看,一个完整的开发平台通常包含飞行控制器、机载计算机、传感器套件等硬件层,以及飞控固件、机器人操作系统(ROS/ROS 2)、软件开发套件(SDK)等软件层,通过分层架构实现飞行控制、感知决策与任务执行的解耦。其技术价值在于大幅降低了无人机行业应用的开发门槛,使开发者无需从零构建飞行控制系统,即可快速实现自动巡检、精准农业、物流配送等复杂

weixin_28712491的博客 412

《Effective C#》Item 9:区别和认识四个判等函数

.Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操作结果。 首先要说的是Object.ReferenceEquals和Object.Equals这两个静态函数,对于它们俩来说,

愚翁专栏 9109

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

DataEaseV2.9 本地开发环境搭建与调试指南

本文详细指导如何搭建DataEase V2.9的本地开发环境,涵盖从软件准备、源码获取、数据库初始化到在IDEA中配置、编译和调试的全过程。重点解决了本地运行环境的关键配置与常见问题,帮助开发者高效开启DataEase的定制化开发与二次开发。

weixin_29290863的博客 141

.NET 中 ==与Equals的区别

在C#中对于值类型的比较不管是用【==】还是【equals】都是对于其内容的比较,也就是说对于其值的比较,相等则返回true 不相等则返回false; 但是对于除string类型以外的引用类型 【==】比较的是在对象在栈上的引用是否相同而【equals】则比较的是对象在堆上的内容是否相同 示例代码: String str1 = new string('a',1); String str2 = new String('a',1);

W's play ground 610

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3032

.net底层知识系列之三 比较 equals(静态、实例) referenceequals 深拷贝,浅拷贝

在C#中,有多种比较方法,有referenceequal,equals,equalsto,但他们之间是有细微差别的。referenceequal的实例class MyClass {   static void Main() {      object o = null;      object p = null;      object q = new Object();     

赛跑的专栏 2083

最小路径和——动态规划求解(Java实现)

最小路径和——动态规划求解(Java实现) 题目: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 这题和机器人走路的思路类似,就是状态方程有所不同,...

weixin_43395911的博客 894

我的python学习之路

Python 是一门功能强大且易于学习的编程语言,广泛应用于数据分析、人工智能、Web 开发、自动化等领域。以下是一个 Python 学习路径的总结,帮助你系统地掌握 Python 编程。

数据知道的博客 3万+

.NET 指南:实现 Equals 方法

关于实现等式操作符(==)的相关信息,请参考:[Equals 与等式操作符(==)的实现指南]。重载 GetHashCode 方法来允许类型在散列数据表中正确地运作。不要在 Equals 方法的实现中抛出异常。而是为 null 参量而返回 false。遵循 Object.Equals 方法中被定义的约定,如下所示:x.Equals(x) 返回 true。x.Equals(y) 与 y.Equals...

weixin_33834075的博客 189

《从理念到落地:Claude Code 在真实项目中的深度实践指南》基于 Anthropic 团队内部使用经验的扩展与深度解读,一篇面向工程团队的全面实践手册

Claude Code 支持通过# 创建新的 API 端点根据以下输入创建完整的 API 端点:资源名称:$ARGUMENTS请创建以下文件:1. `src/routes/{resource}.routes.ts` - 路由定义2. `src/controllers/{resource}.controller.ts` - 控制器3. `src/services/{resource}.service.ts` - 服务层。

AI天才研究院 482

.NET类型对象的判等(Equals)--IT man

Csdn-Blog.NET类型对象的判等(Equals) bsp 申明::本文内容来自>   .NET类型分为:基元类型(Primitivetype),引用类型(Referencetype),值类型(Valuetype),所有这些类型的祖先是System.Object,System.Object提供了四个成员函数: Equals  GetHashCode GetTyp

198

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

.NET对象判等归纳与总结

1、引言   最近在看《CLR via C#》看到对象判等的那一节,觉得这也是.NET基础知识中比较重要的部分就写一篇博文来简单的总结归纳一下。 2、.NET下的对象判等   在.NET中关于对象判等有四个方法。依次是:System.Object.ReferenceEquals、System.Object.Equals、Instance.Equals(实例方法)、Operator=...

diezhi2505的博客 150

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Net复习笔记:第八部分:对象判等

对象判等主要包含了四种方法 1. public virtual bool Equals(object obj) 虚方法比较对象实例是否相等 2.public static bool Equals(object objA,object objB) 静态方法比较对象实例是否相等 3. public static bool ReferenceEquals(object objA,...

LL0006的博客 175

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Net有四个判等函数(Equal ,==,refernceEqual, 以及静态Equal的区别)

.Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操作结果。 首先要说的是Obje

物竞天择,浑然天成 2181

8.2.3 覆写 Equals

  经过对四种不同类型判等方法的讨论,我们不难发现不管是 Equals 静态方法、Equals 虚方法 抑或==操作符的执行结果,都可能受到覆写 Equals 方法的影响。因此研究对象判等就必须将注意 力集中在自定义类型中如何实现 Equals 方法,以及实现怎样的 Equals 方法。因为,不同的类型, 对于“相等”的理解会有所偏差,你甚至可以在自定义类型中实现一个总是相等的类型,例如: ...

weixin_30387339的博客 116

.NET------ 对象判等

.NET 对象判等 — 四种判等方法解析 — 实现自定义Equals方法 — 判等规则 了解.NET的对象判等,有必要从了解几个相关的基本概念开始: l 值相等。表示比较的两个对象的数据成员按内存位分别相等,即两个对象类型相同,并且具有相等和相同的字段...

weixin_34319999的博客 61

C#的四个比较函数!

引自:http://blog.csdn.net/Knight94/archive/2006/08/11/1050901.aspx .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操

marsShan的专栏 1855

C#类型基础Part2-对象判等

引用类型与值类型变量的判等解析

lishen1990的博客 1029

.Net(C#) 对象判等

通过代码可以看出,代码中还是调用Operator==,那我们一般调用Operator==是可以判断值类型量否相等的,相信大家都会有这个疑问,那是因为方法参数是object类型,传入值类型参数,会装箱成object类型,对象就不是相同的实例,这样就会总是返回False了,一般判断对象是否相等的方法有4种。需要注意的是,运算符 == 的重写中的常见错误是,重写的方法内还使用 (a == b)、(a == null) 或 (b == null) 来检查引用相等性。这会调用重载的运算符 ==,从而导致无限循环。

weixin_42098295的博客 397

区别四个判等函数

.net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操作结果。   首先要说的是Object.ReferenceEquals和Object.Equ...

diegui9005的博客 79

[转载]《Effective C#》Item 9:区别和认识四个判等函数

《Effective C#》Item 9:区别和认识四个判等函数《Effective C#》Item 9:区别和认识四个判等函数 .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提...

congji3817的博客 115
上一篇: 什么是MIS?
下一篇: ASP.NET页面生命周期描述
Vigorcsdn
博客等级 码龄23年 0粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值