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

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. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
  2. cookie用法之一,最简单cookie操作
  3. java 数组越界异常_数组越界异常 求解决!!!
  4. SpringMQ的使用
  5. 用css和jquery实现标签页效果(一)
  6. MATLAB学习笔记(七)——MATLAB解方程与函数极值
  7. python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行
  8. G盘文件系统RAW要怎么办啊
  9. 美团NLP实习生招聘
  10. 标准时间标准Time Zone: GMT,UTC,DST,CST
  11. php dht爬虫,利用DHT网络,爬取bt种子。
  12. 微信小程序php签到功能,微信小程序签到功能
  13. php 版onvif 客户端,onvif协议网络摄像机(IPC)客户端程序
  14. 基于SSD目标检测模型的人脸口罩识别
  15. 申请免费SSL证书教程之华为云20张免费证书
  16. iOS设备指纹的前世今生
  17. 畅阳题库管理系统-在线考试(h5+小程序)Java开源版本
  18. C语言打印矩形、长方形、平行四边形、各种三角形
  19. c语言程序设计教程第二版李春葆,C语言程序设计教程.第2版
  20. 如何用计算机装手机系统,教你在手机上安装Windows系统

热门文章

  1. 决策树算法之ID3与C4.5的理解与实现
  2. 让一个 csproj 项目指定多个开发框架
  3. Jzoj5234 外星人的路径
  4. Go - interface
  5. SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
  6. Create PDB with Sample schemas in 12C
  7. error: Your local changes to the following files would be overwritten by merge
  8. jQuery获取Select选择的Text和 Value(转)
  9. IOS7开发~API变化
  10. 文件,文件夹基本操作