C# 中的 == 和 equals()有什么区别?
如以下代码:
|
1
2
3
4
5
6
7
8
9
|
int age = 25;short newAge = 25;Console.WriteLine(age == newAge); //trueConsole.WriteLine(newAge.Equals(age)); //falseConsole.ReadLine(); |
int和short为原始类型,但与“==”比较返回true,equals()比较返回false。为什么呢?
Answers:
简而言之:
“equals()”相比“= =”复杂。
具体来说:
原始类型覆盖(override)基类的object.Equals(object),并且当括弧中的object与其类型和值相同时返回true (注意Nullable类型也适合上述判断;非空Nullable类型总是装箱到一个基础类型实例)。
由于newAge是short,因此在object是short且值与newAge值相等时,newAge.Equals(object)返回true。你传递的是一个int对象,所以它返回false。
相比之下,“= =”运算符被定义为带两个整形(int)或两个短整型(short)或两个长整形(long)的运算。当“= =”两个参数一个是整形和一个短整型时,编译器会隐式转换short为int,并比较转换后int值大小。
使其工作其他方法:
原始类型也有自己的equals()方法,equals接受相同的类型的参数。
如果你写age.Equals(newAge),编译器将选择int.Equals(int)作为最好的重载(overload)方法且隐式转换short为int。然后,它会返回true,因为这种方法直接比较两个int值大小。
short也有一个short.Equals(short)方法,但是int类型不能隐式转换为short,所以就不会调用它。
你可以使用cast转换强制调用这个方法:
|
1
|
Console.Writeline(newAge.Equals((short)age)); //true |
这将直接调用short.Equals(short),没有装箱操作。如果age大于32767,它会抛出一个溢出异常。
你也可调用short.Equals(object)这个重载,但需要明确地传递一个经过装箱的具有相同类型的对象:
|
1
|
Console.WriteLine(newAge.Equals((object)(short)age)); // true |
像前面可选方法(short.Equals(short))一样,如果大小超过short范围,同样抛出一个溢出异常。不同于以往的解决方案,它将short装箱成一个object——浪费time和memory。
Source Code:
这里是实际中使用的Equals():
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public override bool Equals(Object obj) { if (!(obj is Int16)) { return false; } return m_value == ((Int16)obj).m_value; } public bool Equals(Int16 obj) { return m_value == obj; } |
扩展阅读:
C# 中的 == 和 equals()有什么区别?的更多相关文章
- Java中hashCode、equals、==的区别
ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...
- Java中==号与equals()方法的区别
String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...
- java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
- 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中内存分配的 ...
随机推荐
- Map(双列集合)
出现的原因:现实生活中有些数据成对存在. 特点:键不可重复,值可以重复. ----------|Map 数据都是以键值对的形式存在,键唯一,值可重复. --------- ...
- python Django 学习笔记(二)—— 一个简单的网页
1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...
- 如何解决android studio 运行时中文乱码的问题
相信很多朋友都会遇到android studio 在MAC OS中运行的时候中文乱码.而在代码编辑的时候正常.经过几天的不断寻找解决办法,终于解决了 比如: Toast.makeText(MainAc ...
- scp 跨机远程拷贝
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 命令格式: scp [参数] [原路径] [目标路径] ...
- 误删system04.dbf 报:ORA-01157 ORA-01110
DB:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production OS:Oracle Linux 5.7 ...
- Android--获取标题栏,状态栏,屏幕高度
获取状态栏高度 Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int ...
- hdu 5273 Dylans loves sequence
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5273 Dylans loves sequence Description Dylans is give ...
- 关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊
详解 ASP.NET异步 超好的文章
- document.addEventListener理解
document.addEventListener("事件名称", 函数, false); function 某函数(event){ // 方法执行 } addEventListe ...
- ABAP后台JOB数量控制
数据库视图:V_OP 可以查看JOB信息 FORM sub_check_job. * 通过JOB名称,控制活动JOB的数量 , jobname TYPE btcjob , strtdate TYPE ...