C#中==、Equals、ReferenceEquals的区别
原文链接:http://www.studyofnet.com/news/1188.html
本文导读:
C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等,对于相同的基本值类型,==和Equals()比较结果是一样的;由于ReferenceEquals()是判断两个对象的引用是否相等,对于值类型,因为每次判断前都必须进行装箱操作,也就是每次都生成了一个临时的object,因而永远返回false。
一、== 运算符
1、静态相等符号,对应存在的!=,这个符号是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
2、它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。
3、对于引用对象比较其引用(string引用类型除外,string是比较值)
4、对于值类型比较其值
5、某些内置的引用类型重载了==符号,例如string就重载==,使其比较的不是两个字符串的引用,而是比较的两个字符串字面量是否相等。
6、例如:
int i = ;
int j = ;
Console.WriteLine(i == j);//值类型比较代数值 输出True int m = ;
double n = 6.0;
Console.WriteLine(m == n);//类型自动转换并比较数值 输出True
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2==obj1);//引用类型比较引用 输出False
二、Equals
1、用于比较两个对象的引用是否相等。
2、然而对于值类型,类型相同(不会进行类型自动转换),并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。
3、对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。
4、可以根据需要对Equals进行重载
5、实例:
int i = ;
int j = ;
Console.WriteLine(i.Equals(j));//值类型比较 输出True int m = ;
double n = 6.0;
Console.WriteLine(m.Equals(n));//类型不会自动转换并比较数值 输出False object obj = new object();
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出False
Console.WriteLine(obj1.Equals(obj));//引用类型比较 输出False
Console.WriteLine(obj2.Equals(string.Empty));//输出False,比较两对象的类型不同直接返回False
obj1 = obj;
obj2 = obj;
Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出True
Console.WriteLine(obj1.Equals(obj));//引用类型比较 输出True
三、ReferenceEquals
1、Object的静态方法,比较两对象的引用是否相等,值类型和引用类型都是一样。
2、不能在继承类中重写该方法。原型是:public static bool ReferenceEquals(object objA, object objB);FCL已经帮我们实现。它就是比较引用指向的内存地址是否一样。
3、对于2个值类型,ReferenceEquals永远都为false,因为使用ReferenceEquals(object a,object b)方法后值类型被重新装箱为新的引用类型实例,自然不会引用相等。
4、对于2个引用类型,ReferenceEquals则会比较它们是否指向同一地址。
5、实例:
int i = ;
int j = ;
Console.WriteLine(object.ReferenceEquals(i, j));//输出False int m = ;
double n = 6.0;
Console.WriteLine(object.ReferenceEquals(m, n));//输出False object obj = new object();
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出False
Console.WriteLine(object.ReferenceEquals(obj1, obj));//输出False
obj1 = obj;
obj2 = obj;
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出True
Console.WriteLine(object.ReferenceEquals(obj1, obj));//输出True
C#中==、Equals、ReferenceEquals的区别的更多相关文章
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- C#中 Equals和= =的区别
C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...
- (转)Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- C# 中 equals( ) 和 == 的区别和用法
Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...
- Java 中 Equals和==的区别(转)
另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...
- java中equals和==的区别详解
java中的数据类型,可分为两类: 1.基本数据类型. byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的 ...
- C#中equals和==的区别有哪些
本文导读:C# 中==是用来判断变量的值是否相等,相等返回true,不相等返回false.Equals是用来判断两个对象(除string类型外)是否相等,相等的 条件是:值,地址,引用全相等,因为St ...
- java中equals()和==的区别
java中的数据类型 基础数据类型 基础数据类型有byte.short.char.int.long.float.double.bool.String.除了 String 会比较地址,其它的基础类型的比 ...
随机推荐
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- Atitit 代码复用的理解attilax总结
Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...
- 前端学PHP之语句
× 目录 [1]if语句 [2]switch [3]while[4]do-while[5]for语句[6]foreach[7]break[8]continue[9]goto 前面的话 任何 PHP 脚 ...
- # Hawk:开源贡献计划,设计,反思
Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心.软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力. ...
- Notepad++使用小结
还是那句话“工欲善其事必先利其器”用Notepad++也有一段时间了,也积累了一些东西,写篇博文与大家分享一下使用Notepad++的一些心得. 简单的说一下Notepad++是什么东西吧,Note ...
- 前端编码风格规范之 JavaScript 规范
JavaScript 规范 全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这 ...
- 从一道面试题分析javascript闭包
据说是一不注意就会做错的五道javascript面试题之一,我们来看看这道题长什么样 function Container( properties ) { var objthis = this; fo ...
- 重新理解:ASP.NET 异步编程
相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 A ...
- T-Sql(八)字段索引和数据加密
t-sql的基本用法讲到第八章也差不多了,最后就讲下字段索引和数据加密,这两个内容对编程人员可能用的地方不是太多,还是那句老话“防患于未然”. 下面我就简单的说下字段索引和数据加密的内容,只是简单概述 ...
- 1Z0-053 争议题目解析701
1Z0-053 争议题目解析701 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 701.A user receives the following error while per ...