最近园里的TeamOne写了一篇《[C#] int与System.Int32有什么区别》,发现里面有不少精彩的评论,所以忍不住想这篇文章总结一下:

本文的主要参考资料:

  1.《理解C#中的System.Int32和int:并非鸡和鸡蛋》@Author:Dixin

  2.《[C#] int与System.Int32有什么区别》@Author:TeamOne

  一.问题的来源

  MSDN说,int只不过是System.Int32的别名而已,也就是说:

int i=1;
System.Int32 i=1;

  应该是等价的,或者说毫无区别的。但在Dixin在用Reflector对.Net Framework的mscorlib.dll进行反汇编时,发现事情好像并不是这样,看下图:

  上图是Dixin通过Reflector对mscorlib.dll进行反汇编后看到的System.Int32的定义,在上图中,我们看到Int32的定义中用到了int,如果按MSDN中说,int只是System.Int32的别名,那问题就来了:

(1).使用int和使用System.Int32是没有区别的。

(2).在C#的Struct定义中,字段中存在类型为自己的变量,是不允许的,例子如下:

public struct Test
{
public Test value;
}

  上面这个例子编译会失败。由于System.Int32等价于int ,所以System.Int32的编译也应该会失败的!但事实上是,Reflector反编译出来的代码的确显示System.Int32定义中使用了int。这就不禁让人怀疑,int和System.Int32的关系到底是不是如MSDN所说的这么简单呢??究竟int是System.Int32的别名呢?还是System.Int32对int进行了封装呢?

  二.int和System.Int32的关系

  下图是我从微软官方介绍里截取的,我们先简单看一下.Net Framework的架构:

  .Net Framework是一个基础平台,它要支持建立在此基础上的各种语言,以及跨语言程序之间的通信。如图:

  由于上述原因,.Net Framework对外提供的资源必须是通用的,并且避免使用某种语言的特有称呼,以免造成不必要的混淆。

  于是,这就有了int和System.Int32,它们的关系如下图:

  System.Int32是.Net Framework对32位整数的标识,MSDN对这种类型标示的称呼是User Type。而int则是c#语言里面的特有称呼(这里它对应的.Net Framework里的System.Int32),MSDN对c#的int的称呼是Keyword。int就是System.Int32的别名而已!

  那为什么我们在用Reflector反编译mscorlib.dll的时候,会得出第一幅图那种结果呢?

  是这样的,在.Net Framework运行库里,有一种最基础的数据类型,叫“基元类型(primitive)”。这种数据类型是只提供给.Net Framework内部使用,外面是看不见的。其实在真正微软的System.Int32的源码中,用到的应该是int32。但是由于int32不是c#提供的类型,所以Reflector会自动把int32逆向为c#的int,这也就是为什么我们会在System.Int32定义中看到int的存在了。

  这里我引用Dixin文章里的一段IL代码证明int32的存在:>

C#代码:

public int TestMethod(int value)
{
return value * 2;
}

对应得IL代码:

.method public hidebysig instance int32 TestMethod(int32 'value') cil managed
{
.maxstack 2
.locals init (
[0] int32 CS$1$0000)
L_0000: nop
L_0001: ldarg.1
L_0002: ldc.i4.2
L_0003: mul
L_0004: stloc.0
L_0005: br.s L_0007
L_0007: ldloc.0
L_0008: ret
}

  想了解更多的关于“基元类型”的资料,可以参考这篇文章《认识基元类型、FCL类型及与CLR的相容情况》。

  三.System.Int32在64位机器上

  System.Int32在64位机器上还是表示32位的整数,也就是说C#的int在64位机器上也还是表示32位的整数。至于为什么,看下图:

  如果System.Int32在64位机器为64bit,那么,这将会使在32位机器上的C#程序难以和64位上的C#程序沟通,试想一下,要把64bit的数据塞进32bit的空间中是一件多恶心的事情啊!所以,System.Int32在64位机器还是表示32位的长度,是很合理的。

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162722.html

一起谈.NET技术,C#中int和System.Int32理解总结相关推荐

  1. Golang中int, int8, int16, int32, int64和uint区别

    Golang中int, int8, int16, int32, int64和uint区别 前言 测试 结果 结论 总结 前言 在学习go语言时,做算法题会很经常遇到go语言的各种int类型,为什么会有 ...

  2. C# 中int short Int16 Int32 Int64详解

    Java中没有Int32,Int64,,只有int,short,long Java中int就代表Int32 ,short就代表Int16,long就代表Int64 首先,几个基本的关键字: Int16 ...

  3. 浅谈一下对cocos2d-x中九宫格精灵的简单理解和使用

    浅谈一下对cocos2d-x中九宫格精灵的简单理解和使用 首先,使用cocos new命令创建了一个cocos2d-x的C++项目和Lua项目,在生成的HelloWorld中写测试代码. 1.C++代 ...

  4. C#中int short Int16 Int32 Int64区别

    Java中没有Int32,Int64,,java中只有int,short,long Java中int就代表Int32 ,short就代表Int16,long就代表Int64 首先,几个基本的关键字: ...

  5. 计算机在科技英语翻译中起的作用,浅谈科技英语翻译中英语词语的正确理解与表达...

    作者:苏雷江 摘要:在科技英语翻译中,如何正确的理解与表达英语词语对整个翻译过程起着至关重要的作用.本篇文章从词义的选择和词义的引申两个方面来具体阐述如何做到正确的理解与表达科技英语翻译中的英语词语. ...

  6. Golang中 int int8 int16 int32 int64的区别和取值范围

    先说结论吧,方便快速查询验证. 总结 区别 int 类型大小为 8 字节 int8 类型大小为 1 字节 int16 类型大小为 2 字节 int32 类型大小为 4 字节 int64 类型大小为 8 ...

  7. 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)

    上一篇文章中Aicken为大家介绍了.Net平台的垃圾回收机制与其对性能的影响,这一篇中将继续为大家介绍.Net平台的另一批黑马-JIT.有关JIT的机制分析 ● 机制分析以C#为例,在C#代码运行前 ...

  8. Golang中int, int8, int16, int32, int64区别

    猫哥写Golang过程中,遇到整数常用int,因为可以少打至少一个字符. T_T 一直没有意识到其实各个int还是有区别的,起码是内存空间上的区别. 一段简单粗暴的程序,描述一下区别: package ...

  9. golang中int int8 int16 int32 int64 uint8 uint16 uint32 uint64 占用字节和取值范围

    ================================ go grpc-go 相关技术专栏 总入口   go语言基础知识总结.整理.收藏 ========================== ...

最新文章

  1. 调试技巧之 找准调试点
  2. Spring Cloud一站式的微服务架构解决方案
  3. jdk中的动态代理和cglib中动态代理的区别
  4. Exchange系列—Exchange自带灾难恢复工具使用
  5. 51单片机的定时器深入讲解
  6. 在Spring Boot中配置web app
  7. 荣耀v40可以升级华为鸿蒙,网传荣耀V40机型也能升级鸿蒙OS 首批更新机型有望是这5款...
  8. VS Code 中的文件添加图标的插件vscode-icons
  9. 孪生神经网络_孪生网络如何选择负样本? 这是个很好的问题
  10. Java 集合 之 Set
  11. Linux-Ubuntu 远程登录服务器--ssh的安装和配置
  12. 3.9上午(周彤彤)
  13. 进销存库存管理软件哪个好用
  14. 移动友华PT924光猫获取超级用户方法
  15. xfs文件系统修复-xfs_repair
  16. S1 data forwarding测试方法
  17. pthon缺陷检测(机器视觉)
  18. Java web程序设计(笔记无参考价值)
  19. 视频采集工具 youtube-dl 接口介绍
  20. 如何将任意辣鸡话题写成一篇优秀的毕业论文——以本文为例

热门文章

  1. Java项目:嘟嘟网上商城系统(java+jdbc+jsp+mysql+ajax)
  2. 软件测试实验--性能测试工具LoadRunner
  3. 三分钟了解“Java重写”
  4. iOS autolayout 约束冲突添加symbol breakpoint
  5. ant models 内获取 url 的参数传递到组件
  6. JS对象转URL参数
  7. 14-flutter Animation 动画
  8. IDEA的常用操作(快捷键)
  9. 虚拟机无法使用网卡桥接模式
  10. Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)