C#中int和System.Int32理解总结

最近园里的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位的长度,是很合理的。

时间: 2024-10-15 04:48:25

C#中int和System.Int32理解总结的相关文章

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

    最近园里的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;Sy

linq-无法将“System.Int32”强制转换为“System.Object”LINQtoEntities 仅支持转换 EDM

问题描述 无法将"System.Int32"强制转换为"System.Object"LINQtoEntities 仅支持转换 EDM List result = relationDal.SearchRecord( m => m.ECategoryPropertyRelation_Id >= 0 m => m.ECategoryPropertyRelation_Id pageIndex pageSize desc out recordCount);

java-下面约瑟夫环代码中k的等式怎么理解?

问题描述 下面约瑟夫环代码中k的等式怎么理解? package com.seqlist; import java.util.*; public class yuesefu { /** * @约瑟夫环 * 总人数 totalnum * 数到几 countnum * 第几个出列 k */ public static void main(String[] args) { // TODO Auto-generated method stub int totalnum=11; int countnum=6

asp-无法将类型为“System.Int32”的对象强制转换为类型“System.Array”

问题描述 无法将类型为"System.Int32"的对象强制转换为类型"System.Array" 修改Edit.cshtml上部分字段,点击保存跳转到Index.cshtml. 但现在点击保存,就跳出以下错误. **这是Model ** using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnota

编程c语言-c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释

问题描述 c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释 小弟自学c语言以来,遇到各类问题,这个事比较难搞得,请各位帮忙 解决方案 首先请注意,需要大写NULL 其次,在绝大多数的系统上都可以理解为0(这货本来就是个宏定义嘛#define NULL ((void*)0)) 在绝大多数系统上,不存在变量的地址为0,因而0可以被安全地认为是一个不存在变量的地方,指向0的指针一定是个空指针 解决方案二: 不一定哦,你看 String str=null; 代表的是空值, Syste

求助?无法在System.int32和System.string上执行“like”操作

问题描述 错误提示:无法在System.int32和System.string上执行"like"操作.跟踪也不知道是哪的错误! 解决方案 解决方案二:我也不知道哪错了解决方案三:什么叫like?我没明白.是SQL里的吗?1:SQL里int类型是无法like的,要char系列的才行:2:SQL里string类型的方法是:select*fromtablewheretextFieldLike'%T%';解决方案四:错是在int类型无法用Like来匹配,int的解决办法还不知道但是要是改成va

PHP中exec与system用法区别分析_php技巧

本文实例讲述了PHP中exec与system用法区别,分享给大家供大家参考之用.具体方法如下: 一般来说,在PHP中调用外部命令,可以用exec及system来实现: system() 原型:string system (string command [, int return_var]) system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果.第二个参数是可选的,用来得到命令执行后的状态码. 返回结果: 成功返回0,   失败(命令不存在等原因)   返回   非0值 ex

c#代码-System.Type.GetType(&amp;amp;quot;System.Int32&amp;amp;quot;)请教

问题描述 System.Type.GetType("System.Int32")请教 DataTable dt=new DataTable(); dt.Columns.Add("列一",System.Type.GetType("System.Int32")); 中的System.Type.GetType("System.Int32")代表什么意思,小白请教! 解决方案 DataTable 类.aspx "DataTa

调试中显示了System.Data.SqlClient.SqlException”类型的第一次机会异常在 System.Data.dll 中发生 的错误

问题描述 代码如下,查询不到数据库内的内容,总显示"没有成绩",报错调试中显示了System.Data.SqlClient.SqlException"类型的第一次机会异常在System.Data.dll中发生的错误sql语句是对的,在sqlserver里面试过可以查询代码如下:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Configuration;usingSystem.Collect