序:
        昨天技术群中的一个小伙伴发了几个字符串以及值类型比较的面试题,没想到我们的答案不尽人意。。。下面是截图以及答案,看看与各位看官的答案是否相同。
        
        

    0x00:
        查看了几篇前辈写的博客后也有了自己的一些小总结,如有错误请大家指教出来,不胜感激!下面是参考资料的传送门。
        http://new-fighter.iteye.com/blog/1634800
        
    0x01:
        众所周知Java中的String有两种声明方式,1:String str1 = "abc";2:String str2 = new String("abc");这两种存在很大的差异。这里不说,因为此篇的主角是C#。而C#中的string作为引用类型只有一中方式,也就是上述的方式一。在此无论使用“==”还是“Equals”只要是string的字面量相同则比较结果就为ture。这个没什么好说的,下面说一下非string的其他引用类型。

         private class ObjectA
         {
             public string cName = "";
             ;
         }

          ObjectA oa1 = new ObjectA();
          ObjectA oa2 = new ObjectA();
          oa1.cName = "Clown";
          oa1.iAge = ;

          oa2.cName = "Clown";
          oa2.iAge = ;

          bool b01 = oa1.Equals(oa2);
          bool b02 = oa1 == oa2;

          ;
          ;
          bool b5 = (o1 == o2);            // false
          bool b6 = (o1.Equals(o2));     // false
        以上的代码中声明了一个ObjectA类,并在下方实例化了两此此类,给此类的属性赋予了相同的值,通过“==” 与“Equals”比较得到的结果均为false,由此可以推断出除string外的引用类型两者比较的都是引用地址。

    0x02:
        等等,先不要着急关闭浏览器 。引用类型中还有一个特殊的,那就是匿名类。所以上面的0x01中的总结是有BUG的。我们还是先看一下代码,如下:

 };
         };
        , name = " };
        int i1 = a1.GetHashCode();        // -1902033810
        int i2 = a2.GetHashCode();        // -1902033810
        int i3 = a3.GetHashCode();        // -843859346
        bool b4 = a1.Equals(a2);          // true
        bool b5 = a1.Equals(a3);          // false
        bool b6 = a1 == a2;               // false
        //bool b7 = (a1 == a3);           // 如果这面写直接就会爆语法错误的
        上述中声明了a1,a2,a3三个匿名,其中a1,a2属性相同,值相同,属性顺序相同。而a3与两者比较属性相同,值相同,属性属性不相同。则得出的Hash值与两者也有差异。

0x03:
        以上实验结果可以粗略总结为:C#中string(引用类型)通过“==”与“Equals”比较都是对字面量进行比较的,除去string与匿名类外的其他引用类型“==”与“Equals”比较的都是引用地址。而匿名类是通过“==”进行值比较,“Equals”是对引用地址的比较。且还得出匿名类顺序不同则AnonyType是不同的类型。

而序中提到的short.Equals(int)的比较是对我最为困惑的,现在可以根据以上结果分析,short.Equals中形参是Object类型,而引用类型通过“Equals”比较的是引用地址而非字面值。但int.Equals(int),形参为值类型的int,值类型存储在栈上比较的是字面值。故返回true而前者返回false。

【CSharp】C#中equals与==小记的更多相关文章

  1. Java中equals与==和comparaTo的区别

    一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...

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

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

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

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

  4. (转载)Log4Net 在多层项目中的使用小记

    (原创)Log4Net 在多层项目中的使用小记 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各 ...

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

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

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

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

  7. Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用

    以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...

  8. java中equals相同,hashcode一定相同ma

    一.jdk中equals和hashcode的定义和源码进行分析 1.java.lang.Object中对equals()方法的定义 java.lang.Object中对hashCode()方法的定义 ...

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

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

随机推荐

  1. Apache运行python cgi程序

    Apache运行python cgi程序 环境 win10 x64 专业版 Apache2.4 python 2.7 Apache安装和配置 Apache服务器的安装请自行搜索.在Apache2.4中 ...

  2. Razor语法大全

    本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.html Razor是基于framewor4以上写的一个开源项目:https://githu ...

  3. MODIS批量处理软件MRT的安装说明

    最近在处理遥感影像的时候遇见了MODIS影像数据,从中MOD13中提取NDVI是相当的重要.在一番的百度之中找到了处理modis影像的神器------MRT 接下来我来说明一下MRT的具体安装,如果之 ...

  4. 纯CSS3写的10个不同的酷炫图片遮罩层效果

    这个是纯CSS3实现的的10个不同的酷炫图片遮罩层效果,可以欣赏一下 在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  5. 如何用.NET生成二维码?

    二维码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,国外对二维码技术的研究始于20世纪80年代末,在二维码符号表示技术研究方面已研制出多种码制,常见的有P ...

  6. 分享最新15个加速 Web 开发的框架和工具

    我们为开发人员挑选了15个最新的  Web 开发框架,你肯定尝试一下这些新鲜的框架,有的可能略微复杂,有的提供了很多的配置选项,也有一些窗口小部件和界面交互的选择.他们将帮助你创建更优秀的网站,提供给 ...

  7. php获取数组第一个值 current()

    获取数组第一个元素的值,如果是数字索引那还好,直接$array[0],如果键名是字符串,你又未知这个字符串呢?用current()函数就可以做到. current() 函数返回数组中的当前元素(单元) ...

  8. VS2010在64位系统中连接64位Oracle出现的问题和解决方法

    C#使用System.Data.OracleClient连接Oracle数据库.我的是window7/64位系统,装了一个64位的oralce 11G r2 客户端是64位的 用VS10调试错误信息如 ...

  9. jquery messagetip信息语提示控件

    编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺 ...

  10. 在 SharePoint 2013 中选择正确的 API 集

    决定使用哪个 API 集的因素   您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台.您使用哪一个 API 集取决于以下因素: 应用程序的类型. 可能的类型包括但不限于以 ...