当前位置: 首页 > article >正文

C# 运算符和类型强制转换(对象的相等比较)

主要内容

C# 中的可用运算符 处理引用类型和值类型时相等的含义
基本数据类型之间的数据转换
使用装箱技术把值类型转换为引用类型
通过强制转换技术在引用类型之间转换
重载标准的运算符,以支持对定制类型的操作
给定制类型添加强制转换运算符,以支持无缝的数据类型转换

对象的相等比较

对象相等比较的机制对于引用类型(类的实例)的比较和值类型(基本数据类型,结构的实例)的比较来说是不同的。

引用类型的相等比较

System.Object的一个初看上去令人惊讶的方面是它定义3个不同的方法,来比较对象的相等性:ReferenceEquals()和Equals()的两个版本。再加上比较运算符==,实际上有4种进行相等比较的方式。

ReferenceEquals()方法

ReferenceEquals()方法是一个静态方法,测试两个引用是否指向类的同一个实例,即两个引用是否包含内存中的相同地址。作为静态方法,它不能重写,只能使用Object.Object的实现现代码。如果提供的两个引用指向同一个对象实例,ReferenceEquals()总是返回true,否则就返回false。但是它认为null等于null:

SomeClass x,y;
x=new SomeClass();
y=new SomeClass();
bool B1=ReferenceEquals(null,null);//return true
bool B2=ReferenceEquals(null,x);//return false
bool B3=ReferenceWquals(x,y);//return false because x and y point to differenct objects

虚拟的Equals()方法

Equals()虚拟版本的System.Object实现代码也比较引用。这个方法时虚拟的,可以在自己的类中重写的,按值来比较对象。特别是如果希望类的实例用作字典中的键,就需重写这个方法,以比较值。否则,根据重写Object.GetHashCode()的方式,包含对象的字典类要么不工作,要么工作效率非常低。在重写Equals()方法时要注意,重写的代码不会抛出异常。

静态的Equals()方法

Equals()的静态版本与其虚拟实例版本的作用相同,其区别是静态版本带有两个参数,并对他们进行相等比较。可以处理两个对象中有一个是null的情况,如果一个对象可能是null,这个方法就可以抛出异常,提供额外的保护。静态重载版本首先要检查它传送的引用是否为null。如果它们是null,返回true(因为null与null相等)。如果只有一个引用是null,就返回false。如果两个引用都指向某个对象,它就调用Equals()的虚拟实例版本,这表示在重写Equals()的实例版本时,其效果相当于也重写静态版本。

比较运算符==

最好将比较运算符看做看作时严格值比较和严格引用比较之间的中间选项。

值类型的相等比较

在进行比较类型的相等比较时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值,比较运算符可以看作时一个中间项。

本文由 mdnice 多平台发布


http://www.kler.cn/a/505452.html

相关文章:

  • Go语言中http.Transport的Keep-Alive配置与性能优化方法
  • VB.NET 正则表达式完全指南
  • Windows 环境下安装和启动 Redis 服务
  • SpringMVC
  • 【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky
  • Sonatype Nexus OSS 构建私有docker 仓库
  • 深度学习|表示学习|作为损失函数的交叉熵|04
  • 单片机存储器和C程序编译过程
  • vue3封装el-tour漫游式引导
  • 09.VSCODE:安装 Git for Windows
  • .NetCore 使用 NPOI 读取带有图片的excel数据
  • 软件测试 —— Selenium(等待)
  • 物联网云平台:智能硬件芯片 esp32 的开放式管理设计
  • 【Elasticsearch复合查询】
  • 基于spingboot+html技术的博客网站
  • 1.1.1 C语言常用的一些函数(持续更新)
  • 最好用的图文识别OCR -- PaddleOCR(4) 模型微调
  • 【JVM中的三色标记法是什么?】
  • ssh, git 配置多对公私钥
  • 简识MySQL中ReadView、RC、RR的关系
  • 二级缓存(缓存到Redis)
  • Electron 开发者的 Tauri 2.0 实战指南:文件系统操作
  • LeetCode热题100(三十四) —— 23.合并K个升序链表
  • git报错处理
  • linux服务器 常用脚本(超全)
  • SpringBoot项目中解决CORS跨域资源共享问题