今儿给网友讲解了一个判等的问题,看似简单,其实还是蛮有意思的:

object s = 1, t = 1;
Console.WriteLine( "s == t -> {0}", s == t );
Console.WriteLine( "s.Equals(t) -> {0}", s.Equals( t ) );

// 运行结果:
// s == t -> False
// s.Equals(t) -> True

这个结果可能会让不少同学觉得意外,那我就来给大家分析下

object s = 1, t = 1;

这里,我们看到给两个object变量做了初始化,其中伴随着装箱操作,

所谓装箱,简单地说,就是把值类型转换成引用类型的操作——object:引用类型,int:值类型

详细的可以看这篇文章:C# 装箱和拆箱

我们知道,对于值类型(Int32是值类型)的判等,是二进制的按位判等; 而对引用类型(object是引用类型)的判等,默认为判断两者内存地址是否一致。

这里的object对象,s和t分别初始化,所以地址定然不一致

可以是用object.ReferenceEquals方法验证一下:

Console.WriteLine( "ReferenceEquals(s, t) -> {0}", object.ReferenceEquals( s, t ) );

// 运行结果:
// ReferenceEquals(s, t) -> False

结果得到证实,所以 s == t自然就False了

相比而言,后面的表达式s.Equals(t)就会复杂一些

我查看了object.Equals( object )这个方法的代码(用的Reflector):

public virtual bool Equals( object obj )
{
    return RuntimeHelpers.Equals( this, obj );
}

再去查看了RuntimeHelpers.Equals( object, object )的代码,最后发现这是个CLR实现的方法,没有代码···

仔细想想,关键不在RuntimeHelpers.Equals, 而在这个virtual

对了,这是个虚方法,Int32类型必然会重写这个Equals方法。也就是说,在程序中,实际调用的应该是Int32.Equals

再看Int32的Equals方法,结果就明朗了

public override bool Equals( object obj )
{
    return ( (obj is int) && ( this == ( (int) obj ) ) );
}

在这里,s和t都被转换成int类型,再做值类型的按位比较,结果当然是1等于1,返回True

参考:

C# 装箱和拆箱
详解.NET中六个你必须知道的重要概念

转载于:https://www.cnblogs.com/Realh/archive/2011/01/23/1942719.html

一个简单判等例子的深度分析相关推荐

  1. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  2. mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子

    spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...

  3. boost::log模块实现一个简单日志的例子

    boost::log模块实现一个简单日志的例子 实现功能 C++实现代码 实现功能 boost::log模块实现一个简单日志的例子 C++实现代码 #include <boost/log/tri ...

  4. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...

  5. 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...

  6. 一个简单的IPmsg程序源码分析(二)

    离上篇一个简单的IPmsg程序源码分析(一)已经基本半个月(上篇最初发布在点点上面,后边纠结了一下还是选择了博客园),利用空闲的时间终于把源码的构架和一些细节基本都搞清楚了,总的来说是很简单的一个客户 ...

  7. 决策树分析例题经典案例_决策树原理及一个简单的小例子

    首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...

  8. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子

    我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...

  9. 一个简单的时间片轮转多道程序内核代码分析

    郑斌 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第二周的实验内容分析 1. ...

最新文章

  1. 广泛的信号处理链如何让语音助理“正常工作”
  2. 运维不懂这些面试题拿不到高薪
  3. RSA算法原理——(2)RSA简介及基础数论知识
  4. 没有J2EE容器的JNDI和JPA
  5. idea 下划线字段转驼峰_Java如何实现数据库中表字段的下划线和驼峰式命名的Model相互转换,很方便的...-Go语言中文社区...
  6. 安装Orchard错误
  7. Java 数组操作
  8. Vuejs 动态绑定属性
  9. Python turtle库绘制奥运五环
  10. android 全局定时器,高通Android LED驱动移植-GPIO,内核定时器
  11. java组合与继承始示例_Java示例中的组合
  12. Linux chapter 2
  13. TechSmith SnagIt 9 中文破解版v9.1.0
  14. 初步了解JS的作用域
  15. uni app中使用图表
  16. u盘插入电脑,提示 无法识别的usb设备
  17. line-height属性与font-size属性的关系
  18. C#入门教程(一)visual studio与winform
  19. java反射获取字段的顺序6_反射之获取字段
  20. 制度是绝情的,管理是无情的,执行是合情的

热门文章

  1. 温故而知新-面向对象的PHP
  2. PHP实现支付宝即时到账功能
  3. 汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章
  4. 浅析CSS——元素重叠及position定位的z-index顺序
  5. apache+tomcat 子目录映射成子域名
  6. 怎样解决职业发展中遇到的困惑
  7. SEO(搜索引擎最佳化)简介
  8. 精华【分布式、微服务、云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!...
  9. 阿里云全球首批MVP张建平专访 - 我对数据有执念
  10. 关于bat的变量赋值和解析机制