如以下代码:

1
2
3
4
5
6
7
8
9
int age = 25;
 
short newAge = 25;
 
Console.WriteLine(age == newAge);  //true
 
Console.WriteLine(newAge.Equals(age)); //false
 
Console.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;
 
   }

  扩展阅读:

  见Eric Lippert.

C# 中的 == 和 equals()有什么区别?的更多相关文章

  1. Java中hashCode、equals、==的区别

    ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...

  2. Java中==号与equals()方法的区别

    String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...

  3. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  4. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  5. 【转】Java中equals和==的区别

    [转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...

  6. C#中 Equals和= =的区别

    C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...

  7. (转)Java中equals和==的区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  8. C# 中 equals( ) 和 == 的区别和用法

    Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...

  9. Java 中 Equals和==的区别(转)

    另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...

随机推荐

  1. Map(双列集合)

    出现的原因:现实生活中有些数据成对存在. 特点:键不可重复,值可以重复. ----------|Map                数据都是以键值对的形式存在,键唯一,值可重复. --------- ...

  2. python Django 学习笔记(二)—— 一个简单的网页

    1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...

  3. 如何解决android studio 运行时中文乱码的问题

    相信很多朋友都会遇到android studio 在MAC OS中运行的时候中文乱码.而在代码编辑的时候正常.经过几天的不断寻找解决办法,终于解决了 比如: Toast.makeText(MainAc ...

  4. scp 跨机远程拷贝

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 命令格式: scp [参数] [原路径] [目标路径] ...

  5. 误删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 ...

  6. Android--获取标题栏,状态栏,屏幕高度

    获取状态栏高度 Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int ...

  7. hdu 5273 Dylans loves sequence

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5273 Dylans loves sequence Description Dylans is give ...

  8. 关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊

    详解 ASP.NET异步   超好的文章

  9. document.addEventListener理解

    document.addEventListener("事件名称", 函数, false); function 某函数(event){ // 方法执行 } addEventListe ...

  10. ABAP后台JOB数量控制

    数据库视图:V_OP 可以查看JOB信息 FORM sub_check_job. * 通过JOB名称,控制活动JOB的数量 , jobname TYPE btcjob , strtdate TYPE ...