如以下代码:

?
1
2
3
4
5
int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);  //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();

  Answers:int和short为原始类型,但与“==”比较返回true,equals()比较返回false。为什么呢?

  简而言之:

  “equals()”相比“= =”复杂。

--------------------------------------------------------------------------------------------------------

C#中的相等有两种类型:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是说两个对象包含相同的值。而引用相等则比较的是两个对象的引用是否是同一个对象。也就是说,如果ReferenceEquals为True,则Equals必然为True,反过来就不一定了。

这样的话可以看出来,ReferenceEquals我们没有比较去管他什么,系统自动解决,object类实现的静态RefrenceEquals函数就够了。而对于自定义的类型的话,如果想要实现判断值相等,是需要重写Equals函数的。

我们可以看一下string和自定义类的对比:

string strA = "Hello";

string strB = string.Copy(strA);

Console.WriteLine(strA == strB);         //True

Console.WriteLine(strA.Equals(strB));    //True

Console.WriteLine(object.Equals(strA, strB));    //True

Console.WriteLine(object.ReferenceEquals(strA, strB));       //False

class MyClass

{

public int value = 1;

}

...

MyClass oA = new MyClass();

MyClass oB = new MyClass();

Console.WriteLine(oA == oB);   //False

Console.WriteLine(oA.Equals(oB));  //False

Console.WriteLine(object.Equals(oA, oB));  //False

Console.WriteLine(object.ReferenceEquals(oA, oB)); //False

先不考虑==号,看几个Equals的表现,Equals是要实现值相等比较的效果的,.net 在实现string的时候就重写了Equals(object) ,并添加重载函数Equals(string) ,因此两个比较才会返回True。而不实现这两个函数的后果就是都返回False,无法符合Equals函数应有的作用。

由此看来,对于之前我的需求:比较两个自定义类的内容是否相同,还是应该重写Equals(Object),并建议重载对自己的类的实现Equals(MyClass)

而对于==运算符的解释为:通过过判断两个引用是否指示同一对象来测试是否相等。也就是引用相等了,可对于上面对string的测试,RefrenceEquals为False时,==却返回的True,这是因为还有这么一条:当类型不可变(即实例中包含的数据不可更改)时,通过重载运算符== 来比较值是否相等而不是比较引用是否相等可能会很有用

我们大部分情况下写的自定义类都是可变的,所以一般用不到也不应该对==进行重载

转载于:https://www.cnblogs.com/aiqingqing/p/4514782.html

C# == 和equals()区别相关推荐

  1. C#和Java中“==”和“equals”区别

    C#中"=="和"equals"区别如下: 1 using System; 2 class Program 3 { 4 public static void M ...

  2. equalsignorecase和equals区别

    今天写代码,突然忘了equalsignorecase和equals区别,赶紧记录一下. 先下结论: 区别:equals()是Object类中定义的方法,判断两个对象是不是"相等", ...

  3. '=='和equals区别以及jvm内存分配

    "=="和equals方法究竟有什么区别? 比较之前先了解一些背景 (1)Java中内存分配模型 java的内存模型主要分三种, 栈:每个栈中的数据(原始类型和对象引用)都是私有的 ...

  4. java之==和equals区别

    2019独角兽企业重金招聘Python工程师标准>>> "=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的同一块地址. equals所 ...

  5. Java中的==和equals区别

    概述:       A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.       B.对于String a = "a&quo ...

  6. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  7. java equals 区别_Java中equals和==的区别

    转自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据 ...

  8. hashCode() 和equals() 区别和作用

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  9. == 和 equals() 区别

    一.回顾 == 的使用: == :运算符 1. 可以使用在基本数据类型变量和引用数据类型变量中 2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等.(不一定类型要相同)如果比较的是引用 ...

最新文章

  1. three.js 贴图只显示颜色_C4D作品“花里胡哨”?我怀疑你贴图方式有问题……
  2. 统计学Java_【gloomyfish】基于Java的统计学计算结果
  3. Lumen开发:Lumen的异常处理机制
  4. idea上一些比较有用的插件
  5. 有关EMMC、Nandflash、SSD、HDD的科普类说明
  6. 第3课 天安门广场 《小学生C++趣味编程》--C++、Scratch
  7. 奇怪的电梯(洛谷-P1135)
  8. ES基础概念和集群概念
  9. 安卓 mysql读取图片路径_android开发之数据库存取图片
  10. 用TMG搭建×××服务器(二)---L2TP/IPsec ×××
  11. eclipse tomcat cannot create a server using the...
  12. UniWebView for Unity移动端浏览器插件的一些基本情况
  13. c语言playsound参数,通达信playsound函数
  14. Win10下双系统Ubuntu14.04+GTX1070+CUDAcuDNN+Tensorflow环境搭建
  15. Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
  16. 改纸盒大小_【印刷技术】今天才知道,原来要这样制作小规格纸箱
  17. 矩阵笔记1:矩阵分析(第三版)-史荣昌-第一章:线性空间和线性变换
  18. python--web--让python提供api服务--aiohttp
  19. c语言---指针结构体篇
  20. 将Maven配置到Eclipse中

热门文章

  1. 我尽力了,为啥还是Bug不断?
  2. 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
  3. Android 应用中十大常见 UX 错误
  4. Chat:NLP 中文短文本分类项目实践(上)
  5. 再一次证明了普通的U盘和SD(TF)卡的不可靠
  6. windows server如何加强云服务器的安全性
  7. 登录centos虚拟机后显示-bash-4.1
  8. 将windows系统装到USB存储设备
  9. windows Hyper-V Server 2012创建脚本运行环境
  10. 中关村-DIY操作系统之不分区安装Ubuntu系统