C#比較对象的相等性

   对于相等的机制全部不同,这取决于比較的是引用类型还是值类型。以下分别介绍引用类型和值类型的相等性。

1.比較引用类型的相等性

   System.Object定义了三种不同的方法,来比較对象的相等性:ReferenceEquals()和两个版本号的Equals()。再加上比較运算符(==)。实际上有4种进行比較相等的方式。

1.1 ReferenceEquals()方法

命名控件: System

程序集:mscorlib.dll

语法:public static bool ReferenceEquals(Object objA, Object objB)

能够看出ReferenceEquals()是一个静态方法,确定指定的Object实例是否是同样的实例。作为静态方法。所以不能重写。

1.1.1 使用ReferenceEquals()方法比較值类型

int int1 = 3;

bool B1 = Object.ReferenceEquals(int1, int1);//B1为false

    因为objA和objB是值类型,首先进行装箱。然后传递给ReferenceEquals()方法。这意味着,即使objA和objB表示值类型的同一个实例,ReferenceEquals()方法也返回false。

1.1.2 使用ReferenceEquals()方法比較字符串

String s1 = "String1";

String s2 = "String1";

bool B2 = Object.ReferenceEquals(s1, s2);//true

String suffix = "A";

String s3 = "String" + suffix;

String s4 = "String" + suffix;

bool B3 = Object.ReferenceEquals(s3, s4);//false

    当比較字符串时 假设 objA 和 objB 是字符串,假设该字符串会暂留,ReferenceEquals 方法返回 true。 它不运行值相等測试。

在以下的演示样例中。由于它们是一个暂存的字符串的两个实例,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。

由于调用这种方法,须要装箱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebSocket教程

一、为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷&#xff1a…

C# WPF十个美观的界面设计展示

概述很多时候,我们设计的界面总是感觉缺乏美感,不是我们不会开发好看的界面,而是不知道怎么才算美观,这时候我们不妨看看别人好的页面是怎么做的.下面展示一些我觉得做的比较好的cs界面,希望能给大家在平时做界面设计时…

BZOJ3172: [Tjoi2013]单词

【传送门:BZOJ3172】 简要题意: 给出n个单词,你可以理解为将这些单词变成一个个段落,然后求出每个单词在所有段落中出现的次数 题解(一): 刚开始不是很懂题目,结果发现将所有单词看成…

MySQL5.6二进制软件包编译安装详解(三)

一、软件环境 [rootlocalhost ~]# uname -r 3.10.0-862.el7.x86_64 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 二、安装部署过程详解 MySQL安装3种方式:1>rpm包安装应用文件默认安装在/usr/local 目录下2>源码编译需…

Java反射学习总结五(Annotation(注解)-基础篇)

Annotation(注解)简单介绍: 注解大家印象最深刻的可能就是JUnit做单元測试,和各种框架里的使用了。本文主要简介一下注解的用法,下篇文章再深入的研究。 annotation并不直接影响代码语义。可是它可以被看作类似程序的工具或者类库。它会反过来对正在执行…

使用autok3s 安装k3s 集群 和 kuboard 管理集群

一、k3s介绍1.1 什么是k3s?k3s 是经过 CNCF 认证的由 Rancher 公司开发维护的一个轻量级的 Kubernetes 发行版,内核机制还是和 k8s 一样,但是剔除了很多外部依赖以及 K8s 的 alpha、beta 特性,同时改变了部署方式和运行方式,目的…

Nginx—— Rewrite规则的使用

一、使用场景 1、URL访问跳转 (1)页面跳转 (2)兼容性支持(比如新老版本交替时,给老版本一条访问道路) (3)展示效果(比如缩短前台界面的地址栏的url&#…

java对象实例化的方式

java对象实例化的方式有以下几种:1、使用new2、工厂模式3、反射4、clone()方法5、反序列化方式 /** 实现Cloneable和Serializable接口 */public class Book implements Cloneable, Serializable {private static final long serialVersionUID 1L; private Integer …

iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)

生成二维码图片也是项目中常用到的,二维码的扫描Git上有很多好用的,这里主要说下二维码的生成 1.普通二维码 方法 /**生成二维码QRStering:字符串imageFloat:二维码图片大小*/ (UIImage *)createQRCodeWithString:(NSString *)QRS…

libubox

lbubox是openwrt的一个核心库,封装了一系列基础实用功能,主要提供事件循环,二进制格式处理,linux链表实现和一些JSON辅助处理。 它的目的是以动态链接库方式来提供可重用的通用功能,给其他模块提供便利和避免再造轮子。…

社区纠纷不断:程序员何苦为难程序员

出品 | OSC开源社区(ID:oschina2013)今年年初,我们报道“因为被多人侮辱大吼,Swift 之父正式退出 Swift 核心团队”。诸如此类的“语言暴力”、“网络暴力”事件在开源社区乃至整个 IT 社区屡见不鲜。多个技术社区,都出…

PHP 分布式集群中session共享问题以及session有效期的设置

一、Session的原理 以下以默认情况举例: session_start();之后,会生成一个唯一的session_id,每一个用户对应唯一一个session_id,每一个session_id对应服务器端的一个session文件。这个session文件存储着当前session_id的信息&am…

[SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了。 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于ywy_c_asm) (然…

[NOIP2015提高组]运输计划

题目:BZOJ4326、洛谷P2680、Vijos P1983、UOJ#150、codevs4632、codevs5440。 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为ai到bi的距离,所有运输计划一起开始。现在可以把一条边权…

对象存储OSS服务

一、oss是什么 阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。 阿里云OSS将数据文件以…

《Access 2007开发指南(修订版)》一一1.5 什么是数据库对象

本节书摘来自异步社区出版社《Access 2007开发指南(修订版)》一书中的第1章,第1.5节,作者: 【美】Alison Balter,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 什么是数据库对象 Access 2007开发指南(修订版)正如前…

ETL工具kettle的组件--生成记录

今天介绍下kettle的一个比较实用的组件——生成记录;当我们想将一部分文本数据变成数据行,每个字段作为一个数据行的一个列,那么我们可以利用这个组件;它的位置在双击点开根据自己的实际需要进行设置当设置后,可以点击…

Linux学习笔记一

linux  kernel lib module shell tools ls -la: 显示所有文件包括隐藏文件  cat /proc/cpuinfo: 显示cpu信息 man man  /string: 向上搜索string字符串 继续按下小写n向上搜索  ?string: 向下搜索string字符串 继续按下大…

PHP中路由和rewrite的使用

一、场景介绍: 1、简化url地址,方便大家记忆 2、有利于搜索引擎优化 3、安全(让用户看不出网站的目录结构) 举例:比如我这里将main控制器中的bb方法路由到kk,这样,我们a标签请求跳转到cp.xi…

《NoSQL权威指南》导读

引言 NoSQL权威指南“没有什么会比引入新秩序更难,因为创新者必须要面对那些在旧环境中已经做得很好的对手,以及那些在新环境中做得很好的冷漠者。” ——Niccolo Machiavelli [1] 在过去的几十年,我已经通过Elsevier/Morgan Kaufmann出版社出…