基元类型

什么是基元类型?
编译器直接支持的数据类型成为基元类型(Primitive type)。基元类型直接映射到Framework类库(FCL)里面中存在的类型。例如:C#中的int 直接映射到System.Int32类型。因此以下四行代码生成相同的IL:
int a=0;
System.Int32 a=0;
int a=new int();
System.Int32 a=new System.Int32();
下图展示了FCL类型在C#中对应的基本类型:
C#基元类型 FCL类型 说明
sbyte System.Sbyte 有符号8位值
byte System.Byte 无符号8位值
short System.Int16 有符号16位值
ushort System.UInt16 无符号16位值
int System.Int32 有符号32位值
uint System.UInt32 无符号32位值
long System.Int64 有符号64位值
ulong System.UInt64 无符号64位值
char System.Char 16位的Unicode字符
float System.Single 32位浮点数
double System.Double 64位浮点数
bool System.Boolean true/false
decimal System.Decimal 128位高精度浮点值
string System.String 字符数组
object System.Object 所有类型基类型
dynamic System.Object 对于CLR,和object完全一致,C#允许使用简单语法让dynamic参与动态调度
在开发程序中应该使用基元类型还是FCL类型?
C语言规范称:
  从风格上说,最好使用关键字,而不是使用完整的系统类型名称。
CLR via C#上说:使用FCL类型名称,完全不要使用基元类型,理由如下:
  1.C#的string(关键字)映射到System.String(一个FCL类型),所以两者没有区别。类似的,一些开发人员说如果在32位机器上运行int代表32位整数,在64位机器上跑代表64位整数,这个说法不正确,int是映射到System.Int32的,永远是32位整数,如果使用FCL类型,就不会有这样的误解了。
  2.C#的long映射到Sytem.Int64,但是C++/CLI的long是System.Int32。习惯一种语言的人看另外一种语言时候容易误解代码意图。而且很多语言甚至不把long当成关键字。
  3.FCL都将类型名称作为方法名的一部分。例如:BinaryReader类型包含ReadBoolean,ReadInt32,ReadSingle等,Convert类型包含ToBoolean,ToInt32,ToSingle,如以下float那一行代码很不容易理解。
BinaReader br=new BinaryReader();
float val=br.ReadSingle();
Single val=br.ReadSingle();
  4.平时只用C#的程序员经常忘记还可以使用其他语言写面向CLR的代码。比如FCL团队向库里引入了像Array的GetLongLength的方法,该方法返回Int64值,在C#中是long,但在其他语言中不是,再比如:System.Linq.Enumerable的LongCount方法。
 
个人觉得,如果了解了背后的原理,其实使用哪种方式都可以。
posted @ 2016-11-28 14:58  冲破天窗  阅读(324)  评论(0编辑  收藏  举报