C#比較对象的相等性
在以下的演示样例中。由于它们是一个暂存的字符串的两个实例,s1 和 s2 相等。 可是,s3 和 s4 不相等,由于虽然它们是具有同样的字符串值。字符串不会暂留。
1.1.3 使用ReferenceEquals()比較两个对象 object o = null; object p = null; object q = new Object(); bool B4 = Object.ReferenceEquals(o, p);//true p = q; bool B5 = Object.ReferenceEquals(p, q);//true bool B6 = Object.ReferenceEquals(o, p);//false 1.2 Equals()方法 1.2.1 虚拟的Equals()方法 命名空间: System 程序集:mscorlib(在mscorlib.dll中) 语法:public virtual bool Equals(Object obj) Equals()虚拟版本号的System.Object实现代码也比較引用。
但由于这种方法是虚拟的。所以能够在自己的类中重写它。按值来比較对象。
特别是假设希望类的实例用作字典中的键,就须要重写这种方法,以比較值。否则。依据重写Object.GetHashCode()的方式。包括对象的字典类要么不工作,要么工作的效率很低。在重写Equals()方法时要注意,重写的代码不会抛出异常。这是由于假设抛出异常。字典类就会出问题,一些在内部调用这种方法的.NET基类也可能出问题。
Equals 是一个虚方法。同意不论什么类重写事实上现。
表示某个值(本质上能够是不论什么值类型)或一组值(如复数类)的不论什么类都应该重写 Equals。假设类型要实现 IComparable,则它应该重写 Equals。
Equals 的新实现应该遵循 Equals 的全部保证: x.Equals(x) 返回 true。 x.Equals(y) 与 y.Equals(x) 返回同样的值。假设 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true。仅仅要不改动 x 和 y 所引用的对象,x.Equals(y) 的兴许调用就返回同样的值。 x.Equals(null) 返回 false。 Equals 的新实现不应该引发异常。建议重写 Equals 的不论什么类同一时候也重写 System.Object.GetHashCode。
除了实现 Equals(对象)外。还建议全部的类为自己的类型实现 Equals(类型)以增强性能。
比如:
class TwoDPoint : System.Object { public readonly int x, y; public TwoDPoint(int x, int y) //constructor { this.x = x; this.y = y; } public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null) { return false; } // If parameter cannot be cast to Point return false. TwoDPoint p = obj as TwoDPoint; if ((System.Object)p == null) { return false; } // Return true if the fields match: return (x == p.x) && (y == p.y); } public bool Equals(TwoDPoint p) { // If parameter is null return false: if ((object)p == null) { return false; } // Return true if the fields match: return (x == p.x) && (y == p.y); } public override int GetHashCode() { return x ^ y; } } 1.2.2 静态的Equals()方法 命名空间: System 程序集:mscorlib(在mscorlib.dll中) 语法:public static bool Equals(Object objA, Object objB) Dog m1 = new Dog("Alaskan Malamute"); Dog m2 = new Dog("Alaskan Malamute"); Dog g1 = new Dog("Great Pyrenees"); Dog g2 = g1; Dog d1 = new Dog("Dalmation"); Dog n1 = null; Dog n2 = null; Console.WriteLine("null = null: {0}", Object.Equals(n1, n2));//true Console.WriteLine("null Reference Equals null: {0}\n", Object.ReferenceEquals(n1, n2));//true Console.WriteLine("{0} = {1}: {2}", g1, g2, Object.Equals(g1, g2));//true Console.WriteLine("{0} Reference Equals {1}: {2}\n", g1, g2, Object.ReferenceEquals(g1, g2));//true Console.WriteLine("{0} = {1}: {2}", m1, m2, Object.Equals(m1, m2));//true Console.WriteLine("{0} Reference Equals {1}: {2}\n", m1, m2, Object.ReferenceEquals(m1, m2));//false
Console.WriteLine("{0} = {1}: {2}", m1, d1, Object.Equals(m1, d1)); //false Console.WriteLine("{0} Reference Equals {1}: {2}", m1, d1, Object.ReferenceEquals(m1, d1)); //false
静态 Equals(Object, Object) 方法指示两个对象。objA 和 objB,是否相等
它确定两个对象是否表示同一对象引用。 假设成功,该方法返回 true. 这測试与调用 ReferenceEquals 方法等效。 另外。假设 objA 和 objB 都为 null,则方法返回 true。 它确定 objA 或 objB 是否 null。 假设是这样。则返回 false。 假设两个对象不表示同一对象引用,且均不为 null,它调用 objA。
Equals(objB) 而且返回结果。
这意味着。假设 objA 重写 Object.Equals(Object) 方法,该重写调用。
1.3 比較运算符(==) 对于引用类型,== 默认的行为与ReferenceEquals的行为同样,仅有两个对象指向同一个Reference的时候才返回true。可是.NET Framework中的类非常多对==进行了重载,比如String类的==与Equals的行为同样。推断两个字符串的内容是否相等。所以在应用中。对于 系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的执行结果。 重载的运算符 == 实现不应引发异常。重载运算符 == 的不论什么类型还应重载运算符 !=。
比如:
public static bool operator ==(ThreeDPoint a, ThreeDPoint b) { // If both are null, or both are same instance, return true. if (System.Object.ReferenceEquals(a, b)) { return true; } // If one is null, but not both, return false. if (((object)a == null) || ((object)b == null)) { return false; } // Return true if the fields match: return a.x == b.x && a.y == b.y && a.z == b.z; } public static bool operator !=(ThreeDPoint a, ThreeDPoint b) { return !(a == b); } 2.比較值类型的相等性 在比較值类型的相等时,採用与引用类型同样的规则:ReferenceEquals()用于比較引用,Equals()用于比較值,比較运算发能够看做是一个中间项。但最大的差别是值类型须要装箱。才干把他们转换为引用。 ReferenceEquals()在应用于值类型时。总是返回false。
由于调用这种方法,须要装箱。
C#比較对象的相等性相关推荐
- java子类创建过程_JAVA入门小小白学习中ing(匿名对象、封装性、继承性、子类对象的创建过程、spuer关键字(用法一))...
小小白慢慢学习中ing 第十二天 努力努力 本日内容(匿名对象.封装性.继承性.子类对象的创建过程.spuer关键字) 1.匿名对象 创建对象的语法:Person p1 = new Person(); ...
- C#实验报告 类与对象的访问性:银行账户存取款、新建账户、查询余额
实验4 C#程序的流程控制 一.实验目的 (1)理解面向对象的概念,掌握C#定义类和创建对象的方法 (2)区分类的不同数据成员,包括常量.字段和属性的定义方法,并学会控制其访问性 (3)掌握类的方法成 ...
- Java包装类型对象比较相等性注意事项
废话不多说看代码: Integer a = 100; Integer b = 100; a == b 表达式结果为true a.equals(b) 表达式结果为trueInteger a = 1000 ...
- OC学习篇之---对象的拷贝
在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来 ...
- Effective Java:对于全部对象都通用的方法
前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...
- JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...
JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念 <html><body><script type="tex ...
- 对象类什么是面向对象(1)
时间紧张,先记一笔,后续优化与完善. 面向对象(Object Oriented,OO)是前当计算机界关怀的重点,它是90年代件软发开方法的主流.面向对象的观点和应用已超出了程序筹划和件软发开,扩展到很 ...
- python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....
Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...
- Java中的对象要怎样才算相等
一.引用相等性与对象相等性 1. 引用相等性 引用到堆上同一个对象的两个引用是相等的,这就是引用的相等性. 如果想要知道两个引用是否相等,可以使用==来比较变量上的字节组合,如果引用到相同的对象,字节 ...
最新文章
- python 字符串输入时间_Python input()函数:获取用户输入的字符串
- 《实时控制软件开发》学生四次作业成绩总排名
- highroller赌城java下载,非常有用的链接
- 人工智能AI实战100讲(二)-自动驾驶传感器之激光雷达(二)激光雷达配置车型介绍
- Centos7_系统初始优化配置
- magisk卸载内置软件_红米Note7 MIUI12 10.15版 主题和谐 Magisk 省电稳定 迅雷会员
- Java获取微信用户昵称时昵称里有特殊符号导致插入数据库失败(解决方案)
- APM32 系列 MCU 获得 IAR Embedded Workbench 和 SEGGER J-Link Debug Probes 的全面支持
- Appium自动化测试基础 — uiautomatorviewer定位工具
- LeetCode摆动序列
- ROS 简单的跨浏览器通信
- 方舟建立服务器显示cmd,家庭电脑建方舟服务器
- 豆瓣电影Top250数据分析
- 首个搭载8MP摄像头的单SoC行泊一体方案来袭,已拿下多家车企定点
- sublime text3入门教程
- linux脱离终端运行程序
- matlab/simulink石良臣,《MATLAB/Simulink系统仿真超级学习手册》——2.6 MATLAB的图形绘制...
- 2020焊工(技师)考试题及焊工(技师)复审模拟考试
- 说说project2010中的颜色
- 使用计算机扬声器打电话,事实:解决计算机扬声器声音的步骤