zoukankan      html  css  js  c++  java
  • C# 中的 == 和 equals()有什么区别?

    如以下代码:

    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.

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/ranran/p/3696014.html
Copyright © 2011-2022 走看看