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

    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. 代码与图详解性能之Python集合类型(list tuple dict set generator)

    Python内嵌的集合类型有list.tuple.set.dict. 列表list:看似数组,但比数组强大,支持索引.切片.查找.增加等功能. 元组tuple:功能跟list差不多,但一旦生成,长度及 ...

  2. 搭建java环境

    操作系统:Win10 java版本:1.8.0_102 1.下载安装java JDK(安装时把jre放在了同级目录) 地址为:F:\Program Files\Java 目录下 2.配置环境变量 此电 ...

  3. 第 1 章 HTML5 概述

    学习要点: 1.HTML5 的历史 2.HTML5 的功能 3.HTML5 的特点 4.课程学习问题 主讲教师:李炎恢 HTML5 是继 HTML4.01 和 XHTML1.0 之后的超文本标记语言的 ...

  4. FileIputeStream用于读写文件,并且用字节的方式表示出来

    package com.Java; import java.io.FileInputStream; import java.io.FileNotFoundException; import java. ...

  5. HDU 1237 简单计算器 栈

    额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...

  6. i++,++i,Math.max,hasOwnPrototype.ajax,indexOf(),firefox的一些东西,jquery的contains函数,window.open

    一.i++与++i的区别 1 var i=0;3 console.log(i++)5 0 1 var j=0; 2 3 console.log(++j) 4 1 a=++i;相当于i=i+1;a=i; ...

  7. jScrollPane 美化滚动条

    在线实例 滚动条可见 滚动条隐藏 使用方法 <div class="container"> <h1>滚动条可见</h1> <div cla ...

  8. jQuery立体式数字动态增加(animate方法)

    1.HTML结构 <div class="integral">已有<span class="ii"></span>积分< ...

  9. 【javascript激增的思考01】模块化编程

    前言 之前我做过一个web app(原来可以这么叫啦),在一个页面上有很多小窗口,每个小窗口都是独立的应用,比如: ① 我们一个小窗口数据来源是腾讯微博,需要形成腾讯微博app小窗口 ② 我们一个小窗 ...

  10. 读jQuery源码 - Callbacks

    代码的本质突出顺序.有序这一概念,尤其在javascript——毕竟javascript是单线程引擎. javascript拥有函数式编程的特性,而又因为javascript单线程引擎,我们的函数总是 ...