一个简单判等例子的深度分析
今儿给网友讲解了一个判等的问题,看似简单,其实还是蛮有意思的:
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. ...
最新文章
- Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
- cookie用法之一,最简单cookie操作
- java 数组越界异常_数组越界异常 求解决!!!
- SpringMQ的使用
- 用css和jquery实现标签页效果(一)
- MATLAB学习笔记(七)——MATLAB解方程与函数极值
- python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行
- G盘文件系统RAW要怎么办啊
- 美团NLP实习生招聘
- 标准时间标准Time Zone: GMT,UTC,DST,CST
- php dht爬虫,利用DHT网络,爬取bt种子。
- 微信小程序php签到功能,微信小程序签到功能
- php 版onvif 客户端,onvif协议网络摄像机(IPC)客户端程序
- 基于SSD目标检测模型的人脸口罩识别
- 申请免费SSL证书教程之华为云20张免费证书
- iOS设备指纹的前世今生
- 畅阳题库管理系统-在线考试(h5+小程序)Java开源版本
- C语言打印矩形、长方形、平行四边形、各种三角形
- c语言程序设计教程第二版李春葆,C语言程序设计教程.第2版
- 如何用计算机装手机系统,教你在手机上安装Windows系统
热门文章
- 决策树算法之ID3与C4.5的理解与实现
- 让一个 csproj 项目指定多个开发框架
- Jzoj5234 外星人的路径
- Go - interface
- SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
- Create PDB with Sample schemas in 12C
- error: Your local changes to the following files would be overwritten by merge
- jQuery获取Select选择的Text和 Value(转)
- IOS7开发~API变化
- 文件,文件夹基本操作