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

    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的其他引用类型。

 1         private class ObjectA
 2         {
 3             public string cName = "";
 4             public int iAge = 0;
 5         }
 6
 7          ObjectA oa1 = new ObjectA();
 8          ObjectA oa2 = new ObjectA();
 9          oa1.cName = "Clown";
10          oa1.iAge = 18;
11
12          oa2.cName = "Clown";
13          oa2.iAge = 18;
14
15          bool b01 = oa1.Equals(oa2);
16          bool b02 = oa1 == oa2;
17
18          object o1 = 1;
19          object o2 = 1;
20          bool b5 = (o1 == o2);            // false
21          bool b6 = (o1.Equals(o2));     // false


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

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

var a1 = new { name = "123", age = 12 };var a2 = new { name = "123", age = 12 };var a3 = new { age = 12, name = "123" };int i1 = a1.GetHashCode();        // -1902033810int i2 = a2.GetHashCode();        // -1902033810int i3 = a3.GetHashCode();        // -843859346bool b4 = a1.Equals(a2);          // truebool 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。

转载于:https://www.cnblogs.com/MangoCai/p/5257149.html

【CSharp】C#中equals与==小记相关推荐

  1. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  2. JAVA中equals空_Java中为什么查询空字符串跟判断是否为null的时候可以不用equals?...(亲测)

    if(id!=null&&id!="") 代码中经常这样写,空字符串跟null 都不用equals吗? 首先,你的 id!="" 这种写法是错误 ...

  3. (转)Java中equals和==、hashcode的区别

    背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Testpublic void test01() {String a = "a" + ...

  4. java中equals函数所在的类,重写Java中的equals方法介绍

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  5. java 中equals和==的区别

    java9举例代码: 1 String str1 = "abc"; 2 String str2 = "abc"; 3 String str3 = new Str ...

  6. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  7. 【Java】java中 ==,equals,hashcode

    ==运算符是判断两个对象是不是同一个对象,即他们的地址是否相等 object类中equals与==是等效的 覆写equals更多的是追求两个对象在逻辑上的相等,你可以说是值相等,也可说是内容相等.(覆 ...

  8. Java中equals()和“==”区别

    Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...

  9. java中equals,hashcode和==的区别

    原文地址http://blog.csdn.net/hla199106/article/details/46907725 1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 ...

  10. 关于java中equals与==的区别的小实验

    java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...

最新文章

  1. HBase结合MapReduce批量导入
  2. 2016年3月全球操作系统版本份额:Win10仅次win7
  3. 从150kHz 到 150MHz漫谈智能车竞赛中的无线导航技术
  4. 硬件信息统计_读取输出Excel_显示进度
  5. python三层装饰器-Python自动化开发学习4-装饰器
  6. 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验...
  7. 开源docker轻量级管理平台shipyard部署(中文版)
  8. linux缓存文件用户权限错误,CVE-2019-11244漏洞到底该如何修复?--关于缓存文件权限设置...
  9. iOS开发之网络编程--获取文件的MIMEType
  10. 虚拟机linux下git clone 报SSL connect error错误
  11. 【金万维】天联高级版客户端登陆后,打开U8提示服务器端要求网络级身份证(NLA)
  12. 【人脸质量评估】SDD-FIQA基于人脸相似度分布距离的无监督质量评估方法
  13. 有点意思!“古董级” 诺基亚功能机跑 Linux
  14. 2018 阿里 声学模型 语言模型
  15. java写pdf中文不显示_java – iText pdf在使用NOTO字体或Source Hans时不显示中文字符...
  16. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...
  17. Html监听Fbx文件加载,Three.js 导入fbx
  18. 实时显示当前时间(中文版)
  19. 基于微信小程序的高校体育场地预约管理系统
  20. SpringBoot:MultipartResolver 文件上传、大小限制相关配置、实现原理与自定义

热门文章

  1. Nginx源码阅读 --- http模块 --- TCP连接过程
  2. select2多选框无法手动排序问题[转载]
  3. vsftpd安装配置_vsftpd上传文件大小为0(主动模式)
  4. oracle 选择函数,Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
  5. SpringMVC路径配置
  6. [渝粤教育] 山东财经大学 国际经济学 参考 资料
  7. 【渝粤教育】国家开放大学2018年春季 0314-21T兽医基础 参考试题
  8. [渝粤教育] 中国地质大学 材料力学 复习题
  9. 【Python实例第31讲】递归的特征消除法
  10. 论文笔记:Few-Shot Segmentation Without Meta-Learning : A Good Transductive Inference Is All You Need