随笔-20  评论-487  文章-1  trackbacks-14

    方才看到 笼民 的文章 理解C#中的System.In32和int:并非鸡和鸡蛋 

    在确定了"非鸡和鸡蛋"之后,我又很好奇,那他们到底是什么样的鸡,什么样的蛋。

    就好像我当初很诧异string和String为什么要弄两个,只是大小写不一样。

    于是开始了一段比较简单的测试。

    光从表面上看,它们输入时候的颜色是不一样的。string和int,你在vs默认样式下输入是蓝色的,而String和Int32你输入是偏淡绿色的。这个只是表面上的不同,但我以此确定它们绝对不可能是一模一样的(即使作用似乎一样),都是下同样蛋的鸡,却是两只不同实体的鸡(或者说也可能同样是一只鸡下出来的蛋,却是分两窝的。亦或一个却是另一个经过漂染的“马甲”。但肯定不是双黄蛋)。

于是我反查了代码颜色(大家也可以到工具>选项里面对照),并且特意改变样式进行辨别确认,结果如下:
string和int对应的是Keyword
String和Int32对应的都是User Types


PS:我现在在用vs2008只有英文,暂时给出这两个参考。现在问题可以简化为(却不一定能等同为)Keyword和User Types的区别。至于Keyword和User Types的异同,我目前还没有查到切实的区别,有朋友知道否?

http://szw.cnblogs.com/
研究、探讨ASP.NET
转载请注明出处和作者,谢谢!

posted on 2007-12-20 16:02 SZW 阅读(1894) 评论(20)  编辑 收藏 所属分类: ASP.NET

评论:
#1楼  2007-12-20 16:10 | 装配脑袋      
呵呵,我觉得LZ入手这个问题的方向很可爱
  回复  引用  查看    
#2楼  2007-12-20 16:14 | zjfeiye [未注册用户]
...关键字和类名的区别
  回复  引用    
#3楼 [楼主] 2007-12-20 16:16 | SZW      
@装配脑袋
复杂的都被说完了,更深的我也挖不了,只能逆向思维一下了^_^
  回复  引用  查看    
#4楼  2007-12-20 16:17 | sfsf [未注册用户]
并不觉得有多大意义。
  回复  引用    
#5楼  2007-12-20 16:38 | 笨小苏      
为什么不错内存分配,对象生存期入手
关键字只是一符号,具有特权的符号
  回复  引用  查看    
#6楼  2007-12-20 16:40 | Clark Zheng      
也许博主从int和Int32的关系入手可能更好理解 ^_^
  回复  引用  查看    
#7楼  2007-12-20 16:45 | 笼民      
至于Keyword和User Types的异同,我目前还没有查到切实的区别,有朋友知道否?

呵呵,我那篇其实一开始就说了:
int只不过是System.Int32的别名而已。
出处:http://msdn2.microsoft.com/zh-cn/library/s1ax56ch(VS.80).aspx

你的比喻很幽默:int就是Int32的马甲而已,string就是String的马甲。
  回复  引用  查看    
#8楼  2007-12-20 16:47 | 笼民      
@笨小苏
为什么不错内存分配,对象生存期入手

int就是Int32。内存分配,对象生存期上完全没有问题啊。
  回复  引用  查看    
#9楼 [楼主] 2007-12-20 17:04 | SZW      
@笼民
别名归别名,我当初是想,只是别名的话,他们的类型又为什么不一样,不过后来通过你给的页面看到了这个http://msdn2.microsoft.com/zh-cn/library/ya5y69ds(VS.80).aspx

原来 int,strng 是C# 类型 ,Int32和String 是 .NET Framework 类型
那区别就在这了
  回复  引用  查看    
#10楼 [楼主] 2007-12-20 17:06 | SZW      
@笨小苏
你也姓苏?
  回复  引用  查看    
#11楼 [楼主] 2007-12-20 18:46 | SZW      
@笼民
我们是不是可以这样来理解:用Int32 i=new Int32();的时候,是实例化了一个Int32,而用int j = new int();或者int j = 0;的时候,只是创建了一个普通的32位整数变量,并给他负值为0。
两者结果都为0,但是出处不同:i=0来自Int32的默认(归根结底是系统默认),而j=0直接来自系统默认。
  回复  引用  查看    
#12楼  2007-12-20 18:46 | jisen      
int是C#类型,int32是IL预定义类型,int在编译的过程要被映射为int32
  回复  引用  查看    
#13楼  2007-12-20 18:56 | 阿不      
同意,最终要以IL为准。
  回复  引用  查看    
#14楼  2007-12-20 21:58 | Muse      
我的理解:
要说鸡和蛋的问题的话,那么System.Int32算是鸡(蛋),C#的int算是这只鸡下的蛋(孵出的鸡)。

.NET是跨语言的,所以所有的语言必须以CLR为基础,而楼主所看到的Int32定义中使用了int关键字,但是如果你用VB或者其他什么语言反编译的话,这个int就会是那种语言的32位整型关键字。

其实说到底,int和System.Int32都是CLR的32位整型,System.Int32是为了实现OOP的对象定义,C#的int只是C#这个语言的关键字,而编译器则因为两者相同,所以int可以认为是System.Int32“在C#语言中”的别名
  回复  引用  查看    
#15楼 [楼主] 2007-12-20 22:04 | SZW      
@Muse
你跟我的部分想法是一样的,我在http://www.cnblogs.com/AndersLiu/archive/2007/12/20/1007668.html 的回复里面也提到了.dll反编的时候(C#)取到int而不是System.Int32

上面这篇文章的本身你也可参考一下那些测试结果。
  回复  引用  查看    
#16楼  2007-12-21 01:11 | Henry Liang      
Muse的理解是对的。
CLR via C#这本书里面对这个问题有明确的解答。
  回复  引用  查看    
#17楼  2007-12-21 12:03 | Icebird      
如果以后有Delphi#,那么就会有Integer和Int32
  回复  引用  查看    
#18楼  2007-12-21 14:02 | 笼民      
@SZW
--引用--------------------------------------------------
SZW:
我们是不是可以这样来理解:用Int32 i=new Int32();的时候,是实例化了一个Int32,而用int j = new int();或者int j = 0;的时候,只是创建了一个普通的32位整数变量,并给他负值为0。
两者结果都为0,但是出处不同:i=0来自Int32的默认(归根结底是系统默认),而j=0直接来自系统默认。
--------------------------------------------------------
Int32 i=new Int32();和int i = 0;的IL是一模一样的。

我那篇文章已经修改过了,你可以看看最后的那个截图:
http://www.cnblogs.com/yandixin/archive/2007/12/20/Int.html
  回复  引用  查看    
#19楼  2007-12-21 16:16 | feesuo      
关键字为特有字符。。。所以。。
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-20 22:05 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: