今天这篇文章会不是很长,主要是给大家介绍一下我们CLR中的一些基元类型,最近年底,确实比较忙。希望大家理解下。
记得我刚开始学会写程序的时候一直都闹不明白,什么时候要用string而什么时候又要用String(当然,我是半路出家的当时基础只是也不是很好,大侠们就不要喷我了吧 ^ _ ^)当过了一段时间时候,自己又实验了一下感觉貌似没什么区别,又查找了写资料,发现我们在C# 中可以使用string关键字是因为编译器会把我写的string的类型,对应到System.String类型,加了string关键字只是为了让我们在写代码的时候方便阅读。当然,int和System.Int32 也是一样的。
在我们C#中有很多基元类型byte,,short,int,double,long,float,bool等。它们都对应自己相应的FCL类型,但是都有对应的FCL类型,是否在.net平台上所有的语言都可以解析呢?答案是否定的。每个语言都有每个语言的特性,比如在C#中,int类型对应的是有符号32位整数值,long类型对应的是有符号64位整数值,但是在C++中,int类型对应的是有符号16为整数值,而long是对应的有符号32位整数值。之前我给大家提到过,如果要在.net平台中用C#写的类库能使其它语言使用,必须遵守一个标准CLS(详情见:初读CLR Via C# 之 IL、CTS、CLS),只有在遵守了这个标准之后才能实现.net平台下的无缝移植。
在书中,还有checeked/unchecked代码段的介绍,但是在笔者的实际开发中,确实没有用到过checked和unchecked代码段,所以在这里就不啰嗦了,如果读者有兴趣,可以百度一下。
那么在这里,我还要说一下另一个基元类型,System.Decimal,该类型为128位有符号高精度浮点值,但是在CLR中,Decimal类型并不被认为是基元类型,也就是说,Decimal在被定义的时候,它就是特殊的。我们通过文档可以看到Decimal对我们的所有操作符都进行了重载,如图:
我们可以看下Addition的语法,如图:
那么,我们接下来可以看下在IL代码下,Decimal是怎样表示的,首先贴代码:
static void Main(string[] args) { Decimal da = new Decimal(2); Decimal db = 3; Decimal dc = da + db; }
然后是IL代码:
通过上图我们可以看到,Decimal在编译之后进行求和的IL的代码,并没有一个很简介的IL代码,来表示一个求和的操作,而是通过方法。那么我们再看下int类型编译之后求和的IL代码:
通过这两张图进行比较,我们应该很轻易就能想到,CLR在进行处理基元类型的时候,Decimal的处理速度慢于处理int基元类型的速度。那么,在这里提醒大家一句,如果你要使用checked/unchecked代码段,对Decimal是无效的,因为在IL代码中,没有相应的IL代码来表示Decimal的加、减、乘、除等操作。
以上为笔者对C# 基元类型的理解。如有不对的地方,请指出。下一章,笔者将写一下值类型和引用类型、装箱和拆箱的理解。
再为群里面的论坛做一个宣传,论坛地址为:www.175m.com 希望大家可以在论坛里面一起建设、讨论该论坛(希望博客园的大哥们,不要以为我在挖墙角,我只是在为我们程序员的大家庭做贡献)