基元类型
什么是基元类型?
编译器直接支持的数据类型成为基元类型(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方法。
个人觉得,如果了解了背后的原理,其实使用哪种方式都可以。