一个简单判等例子的深度分析
今儿给网友讲解了一个判等的问题,看似简单,其实还是蛮有意思的:
Console.WriteLine( "s == t -> {0}", s == t );
Console.WriteLine( "s.Equals(t) -> {0}", s.Equals( t ) );
// 运行结果:
// s == t -> False
// s.Equals(t) -> True
这个结果可能会让不少同学觉得意外,那我就来给大家分析下
这里,我们看到给两个object变量做了初始化,其中伴随着装箱操作,
所谓装箱,简单地说,就是把值类型转换成引用类型的操作——object:引用类型,int:值类型
详细的可以看这篇文章:C# 装箱和拆箱
我们知道,对于值类型(Int32是值类型)的判等,是二进制的按位判等; 而对引用类型(object是引用类型)的判等,默认为判断两者内存地址是否一致。
这里的object对象,s和t分别初始化,所以地址定然不一致
可以是用object.ReferenceEquals方法验证一下:
// 运行结果:
// ReferenceEquals(s, t) -> False
结果得到证实,所以 s == t自然就False了
相比而言,后面的表达式s.Equals(t)就会复杂一些
我查看了object.Equals( object )这个方法的代码(用的Reflector):
{
return RuntimeHelpers.Equals( this, obj );
}
再去查看了RuntimeHelpers.Equals( object, object )的代码,最后发现这是个CLR实现的方法,没有代码···
仔细想想,关键不在RuntimeHelpers.Equals, 而在这个virtual
对了,这是个虚方法,Int32类型必然会重写这个Equals方法。也就是说,在程序中,实际调用的应该是Int32.Equals
再看Int32的Equals方法,结果就明朗了
{
return ( (obj is int) && ( this == ( (int) obj ) ) );
}
在这里,s和t都被转换成int类型,再做值类型的按位比较,结果当然是1等于1,返回True
参考:
转载于:https://www.cnblogs.com/Realh/archive/2011/01/23/1942719.html
一个简单判等例子的深度分析相关推荐
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子
spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...
- boost::log模块实现一个简单日志的例子
boost::log模块实现一个简单日志的例子 实现功能 C++实现代码 实现功能 boost::log模块实现一个简单日志的例子 C++实现代码 #include <boost/log/tri ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的IPmsg程序源码分析(二)
离上篇一个简单的IPmsg程序源码分析(一)已经基本半个月(上篇最初发布在点点上面,后边纠结了一下还是选择了博客园),利用空闲的时间终于把源码的构架和一些细节基本都搞清楚了,总的来说是很简单的一个客户 ...
- 决策树分析例题经典案例_决策树原理及一个简单的小例子
首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...
- java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...
- 一个简单的时间片轮转多道程序内核代码分析
郑斌 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第二周的实验内容分析 1. ...
最新文章
- 广泛的信号处理链如何让语音助理“正常工作”
- 运维不懂这些面试题拿不到高薪
- RSA算法原理——(2)RSA简介及基础数论知识
- 没有J2EE容器的JNDI和JPA
- idea 下划线字段转驼峰_Java如何实现数据库中表字段的下划线和驼峰式命名的Model相互转换,很方便的...-Go语言中文社区...
- 安装Orchard错误
- Java 数组操作
- Vuejs 动态绑定属性
- Python turtle库绘制奥运五环
- android 全局定时器,高通Android LED驱动移植-GPIO,内核定时器
- java组合与继承始示例_Java示例中的组合
- Linux chapter 2
- TechSmith SnagIt 9 中文破解版v9.1.0
- 初步了解JS的作用域
- uni app中使用图表
- u盘插入电脑,提示 无法识别的usb设备
- line-height属性与font-size属性的关系
- C#入门教程(一)visual studio与winform
- java反射获取字段的顺序6_反射之获取字段
- 制度是绝情的,管理是无情的,执行是合情的
热门文章
- 温故而知新-面向对象的PHP
- PHP实现支付宝即时到账功能
- 汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章
- 浅析CSS——元素重叠及position定位的z-index顺序
- apache+tomcat 子目录映射成子域名
- 怎样解决职业发展中遇到的困惑
- SEO(搜索引擎最佳化)简介
- 精华【分布式、微服务、云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!...
- 阿里云全球首批MVP张建平专访 - 我对数据有执念
- 关于bat的变量赋值和解析机制