建议11: 区别对待==和Equals

建议11: 区别对待==和Equals在开始本建议之前,首先要明确概念“相等性”。CLR中将“相等性”分为两类:“值相等性”和“引用相等性”。如果用来比较的两个变量所包含的数值相等,那么将其定义为“值相等性”;如果比较的两个变量引用的是内存中的同一个对象,那么将其定义为“引用相等性”。无论是操作符“==”还是方法“Equals”,都倾向于表达这样一个原则:对于值类型,如果类型的值相等,就应该返回True。对于引用类型,如果类型指向同一个对象,则返回True。下面的代码输出所遵循的就是以上原则:static void ValueTypeOPEquals()  
{  int i = 1;  int j = 1;  //True  Console.WriteLine(i == j);  j = i;  //True  Console.WriteLine(i == j);  
}  static void ReferenceTypeOPEquals()  
{  object a = 1;  object b = 1;  //False  Console.WriteLine(a == b);  b = a;  //True  Console.WriteLine(a == b);  
}  static void ValueTypeEquals()  
{  int i = 1;  int j = 1;  //True  
    Console.WriteLine(i.Equals(j));  j = i;  //True  
    Console.WriteLine(i.Equals(j));  
}  static void ReferenceTypeEquals()  
{  object a = new Person("NB123");  object b = new Person("NB123");  //False  
    Console.WriteLine(a.Equals(b));  b = a;  //True  
    Console.WriteLine(a.Equals(b));  
} 
但是,我们同时也要了解,无论是操作符“==”还是“Equals”方法都是可以被重载的。比如,对于string这样一个特殊的引用类型,微软觉得它的现实意义更接近于值类型,所以,在FCL中,string的比较被重载为针对“类型的值”的比较,而不是针对“引用本身”的比较。从设计上来说,很多自定义的类型(尤其是自定义的引用类型)会存在和string类型比较接近的情况。如例子中所举的类型Person,在现实生活中,如果两者的IDCode是相等的,我们就认为两者是同一个人,这个时候,就要重载Equals这个方法,代码如下所示:class Person  
{  public string IDCode { get; private set; }  public Person(string idCode)  {  this.IDCode = idCode;  }  public override bool Equals(object obj)  {  return IDCode == (obj as Person).IDCode;  }  
} 
这时,再通过Equals去比较两个具有相同IDCode的Person对象的值,返回的就会是true,代码如下所示:object a = new Person("NB123");  
object b = new Person("NB123");  
//False  
Console.WriteLine(a == b);  
// True  
Console.WriteLine(a.Equals(b)); 
这里,再引出操作符“==”和“Equals”方法之间的一点区别。一般来说,对于引用类型,我们要定义“值相等性”,应该仅仅去重载Equals方法,同时让“==”表示“引用相等性”。注意 由于操作符“==”和“Equals”方法从语法实现上来说,都可以被重载为表示“值相等性”和“引用相等性”。所以,为了明确有一种方法肯定比较的是“引用相等性”,FCL中提供了Object. ReferenceEquals方法。该方法比较的是:两个示例是否是同一个示例。

 

转载于:https://www.cnblogs.com/xust/articles/3081355.html

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

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

相关文章

mysql如何修改开启允许远程连接

关于mysql远程连接的问题,大家在公司工作中,经常会遇到mysql数据库存储于某个人的电脑上,大家要想连接mysql服务,装有mysql服务的电脑就必须开启远程连接 第一步,用dos连接上你的数据库,(我这里…

Objective-C马路成魔【14-关键C语言功能】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主。捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 这里介绍一些特性&#x…

Solidworks如何自动打开和关闭特征识别FeatureWorks

如果直接对已有的零件识别特征,可能会报错 删除多余的特征,先只保留一个输入(注意没有必要连草图也删掉,草图不会影响识别特征,你识别完了之后草图再接着该拉伸拉伸,该切除切除),然后…

SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制

目录OLED SPI 端口定义七针OLED引脚定义六针OLED引脚定义驱动程序oled.coled.holedfont.h使用main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 DMA控制见【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、…

分享网页到微信朋友圈的官方接口

看到 JiaThis 增加了微信分享的按钮,查看了下网络请求,是官方提供的接口,不过官方文档还没有这方面的信息。这个接口应该是合作测试中的,不排除以后会更改或者停用。 目前分享到微信朋友圈不同于通常的分享,需要先向微…

WordPress PHP Fatal Error “Maximum execution time of 30 seconds exceeded” 的解决办法

修改Wp-config.php 在wp-config.php中增加一行,注意在/* That’s all, stop editing! Happy blogging. */”这一行之前加入: set_time_limit(60); https://blog.csdn.net/cnpinpai/article/details/84575015

上传图片在页面上显示

看了别人写的 自己照着写了一下 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()"…

Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题

A. GukiZ and Contest Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/problem/A Description Professor GukiZ likes programming contests. He especially likes to rate his students on the contests he prepares. Now, he has deci…

提高你的Java代码质量吧:使用valueof前必须进行校验

一、分析 每个枚举都是java.lang.Enum的子类&#xff0c;都可以访问Enum类提供的方法&#xff0c;比如hashCode、name、valueOf等&#xff0c;其中valueOf方法会把一个String类型的名称转变成枚举项&#xff0c;也就是在枚举项中查找字面值和该参数相等的枚举项。 我们来深入…

【STC15库函数上手笔记】9、硬件SPI

目录硬件知识库函数spi.cspi.h测试main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 摘自《STC15系列单片机器件手册》 STC15系列单片机还提供另一种高速串行通信接口——SPI接口。SPI是一种全双工…

中介者模式分析、结构图及基本代码

&#xfeff;&#xfeff;定义&#xff1a;用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地相互引用。从而使其耦合松散&#xff0c;并且能够独立地改变它们之间的交互。适用地方&#xff1a;中介者模式一般应用于一组对象以定义良好可是复杂的方式进行通信…

WordPress 数据库结构及表字段作用解析

对于WordPress的开发可以说子凡已经是如痴如醉了&#xff0c;通过 WordPress 本身的开放性接口可以做到很多的事情&#xff0c;但是有些时候我们可能更喜欢直接查询数据库来实现某些 WordPress 没有提供的函数来实现目的&#xff0c;所以这时候我们就需要对WordPress 数据库的结…

硬件负载均衡设备介绍

最常用是F5 与citrix netscaler 负载均衡分全局负载均衡和本地负载均衡。 地负载均衡是指对本地的服务器群做负载均衡&#xff0c;全局负载均衡是指对分别放置在不同的地理位置、有不同网络结构的服务器群间作负载均衡。 循环DNS 就是每次解析域名时指向IP loop list 里的下一个…

【STC15库函数上手笔记】10、EEPROM

目录硬件知识基本介绍软件知识EEPROM多字节读函数EEPROM多字节写函数EEPROM扇区擦除函数函数测试main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 基本介绍 摘自《STC15系列单片机器件手册》 STC…

Android中shape中的属性大全

<shape><!-- 实心 --><solid android:color"#ff9d77"/><!-- 渐变 --><gradientandroid:startColor"#ff8c00"android:endColor"#FFFFFF"android:angle"270" /><!-- 描边 --><strokeandroid:wid…

Mysql 插入中文错误:Incorrect string value: '...' for column 'xx' at row 1

datasource url后面加上useUnicodetrue&characterEncodingutf-8alter table w default character set utf8; alter table w change score score varchar(50) character utf8; 转载于:https://www.cnblogs.com/orziii/p/7372339.html

修改WordPress中上传附件2M大小限制的方法

https://blog.csdn.net/u010486124/article/details/38348327?utm_sourceblogxgwz7 post_max_size512M upload_max_filesize512M

ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)

MD5加密,Parameters防止SQL注入:protected void btnLog_Click(object sender, EventArgs e){//获取验证码string code txtCode.Text;//判断用户输入的验证码是否正确if (Request.Cookies["CheckCode"].Value code){//创建数据库连接SqlConnection con new SqlConn…

【51单片机快速入门指南】4.6:I2C 与 PCF8563实时时钟日历芯片

目录硬知识概述特性功能描述报警功能模式定时器模式CLKOUT输出复位低电压检测器和时钟监视器低电压检测器和时钟监视器寄存器结构寄存器概述BCD编码格式寄存器概述Control/Status 1 寄存器&#xff08;内存地址00H&#xff09;Control/Status 2 寄存器&#xff08;内存地址01H&…

(转) Spring读书笔记-----Spring的Bean之配置依赖

前一篇博客介绍了Spring中的Bean的基本概念和作用域&#xff08;Spring读书笔记-----Spring的Bean之Bean的基本概念 &#xff09;,现在介绍Spring Bean的基本配置。 从开始我们知道Java应用中各组件的相互调用的实质可以归纳为依赖关系。根据注入方式的不同&#xff0c;Bean的依…