C#编程(三十九)----------比较对象的相等性
比较对象的相等性
需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.
对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.
比较引用类型的相等性
System.Object定义了三个不同的方法来比较对象的相等性:ReferenceEquals()和Equals()两个版本,再加上比较运算符,实际上有四种进行相等比较的方式.
1.ReferenceEquals()方法
以下是ReferenceEquals()方法的定义
public static bool ReferenceEquals(object objA, object objB)
ReferenceEquals()是一个静态方法,测试两个引用是够引用类的同一个实例,特别是两个引用是否包含内存中的相同地址.作为静态方法,他不能重写,所以System.Object的实现代码保持不变.如果提供的两个引用引用同一个对象实例,则ReferenceEquals()总是返回true;否则就返回false.但是它默认 null等于null;
案例:
SomeClass x,y;
x=new SomeClass();
y=SomeClass();
bool b1=ReferenceEquals(null,null) //返回真
bool b2=ReferenceEquals(null,x) //返回假
bool b3=ReferenceEquals(x,y) //返回假,因为x和y指向不同的对象
2.虚拟的Equals()方法
以下是Equals()方法的定义:
public virtual bool Equals(object obj)
返回一个值,该值指示当前的object是否等于当前的object.
Equals的默认实现仅支持引用相等,但派生类可重写此方法一直吃值相等.
在下面的列表中,x,y,z表示不为空的引用:
(1)除设计浮点型的情况外,x.Equals(x)都返回true
(2)x.Equals(y)返回与y.Equals(x)相同的值
(3)如果x和y都为NaN,则x.Equals(y)返回true.
(4)当且仅当x.Equals(z)返回true时,(x.Equals(y)&&y.Equals(z))才返回相同的值
(5)只要不修改x和y引用的对象,对x.Equals(y)的相机调用将返回相同的值
(6)x.Equals(null)返回false
案例:
public class Sample
{
public void Method()
{
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2));//返回假
obj2 = obj1;
Console.WriteLine(obj1.Equals(obj2));//返回真
Console.ReadKey();
}
}
3.静态的Equals()方法
以下是静态的Equals()方法的定义
public static bool Equals(object objA , object objB)
如果objA是与objB相同的实例,或者如果两者均为空引用,或者如果objA.Equals(objB)返回true,则为true ,否则为false.
值类型的相等比较
在进行值类型的相等比较的时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值.最大的区别是,值类型需要装箱才能把他们转换为引用,才能对他们执行方法.
ReferenceEquals()在应用值类型时,总是返回false,因为为了调用这个方法,值类型需要装箱到对象中.即使使用下面的代码:
int v = 10;
bool b = ReferenceEquals(v, v);
Console.WriteLine(b);//b返回false
因为在转换每个参数时,v都睡被单独装箱.
C#编程(三十九)----------比较对象的相等性的更多相关文章
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/ind ...
- NeHe OpenGL教程 第三十九课:物理模拟
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- Gradle 1.12用户指南翻译——第三十九章. IDEA 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式
第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...
- WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...
- 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- “全栈2019”Java第三十九章:构造函数、构造方法、构造器
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 微信小程序把玩(三十九)navigation API
原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...
随机推荐
- css1-puchong1
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. 一:HTML DOM 树 ...
- 1 、在Linux(centos6.8)系统下的JDK安装与配置
一.解压jdk安装包: 附上jdk1.8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...
- 关于NOIP2018初赛
题面 这次PJ初赛有点傻了,可能是因为兴华水土不服吧(在这荒度了六年级的光阴). 选择题 DDDBBAAAABABBBB 第四题 当时懵了,我啥也不知道,于是就开始蒙 A.LAN B.WAN C.MA ...
- iOS企业包安装注意事项详解(解决提示iPhone未受信任的问题)
请在Safari浏览器上打开该页面才能正常安装. 如果您是微信中查看该页面,请点击右上角,在弹出的菜单中选择“在Safari中打开” 对于iOS版本为7.X和8.X的用户,直接点击安装即可(此处为it ...
- 在win7_64bit + ubuntu-12.04-desktop-amd64+VMware-workstation-full-10.0.1-1379776平台上安装ns-allinone-2.35
step1. ns-allinone-2.35的下载地址:http://www.isi.edu/nsnam/ns/ns-build.html#allinone step2. 在虚拟机中打开term ...
- Android Studio 入门级教程(二):新建一个属于自己的工程并安装Genymotion模拟器
声明 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4392611.html [系列] Andr ...
- XML与HTML区别
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Xml简介 1. xml是什么? Xml 是eXtended markup lang ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- webpack+vue-cli中代理配置(proxyTable)
在做vue的项目时,用到webpack打包工具,我们会发现本地开发开启的node服务地址请求接口的地址存在跨域问题.本地开启的服务地址是 http://localhost:8080 而服务器的地址是 ...
- odoo国际化翻译
翻译功能简述 每个模块的翻译文件放在该模块目录下i18n目录里. 模块内相关字符串一般用英语写成,然后通过翻译模板导出功能,导出一个翻译模板po文件. 翻译人员使用翻译软件(poedit)进行翻译后, ...