您的位置:首页 > 编程语言 > C#

[CLR via C#]基元类型

2015-09-06 10:53 246 查看
一、什么是基元类型

某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们。例如,可以使用以下语法来分配一个整数:

System.Int32 a = new System.Int32();

但你肯定不愿意使用这种语法来声明并初始化一个整数,因为实在是太繁琐了。幸运的是,包括C#在内的许多编译器都允许换用如下所示的语法:

int a = 0;

这种语法不仅增加了代码的可读性,而且生成的IL代码与使用System.Int32时生成的IL代码是完全一样的。这种编译器直接支持的数据类型称为基元类型(primitive type)。基元类型直接映射到Framewok类库中存在的类型。

基本类型还有写成文本常量,文本常量可被看成是类型本身的一个实例,所以可以像下面为一个实例(123)调用实例方法:

Console.WriteLine(123.ToString());

此外,如果一个表达式由文本常量构成,编译器能在代码编译时完成对表达式的求值,从而增强应用程序的性能:

Int32 x = 100 + 20; //编译生成的代码将x设为120

二、C#有哪些基元类型

C#基元类型  FCL类型  CLC相容说明
sbyte  System.SByte否  有符号8位数
byte  System.Byte无符号8位数
short  System.Int16有符号16位数
ushortSystem.UInt16无符号16位数
intSystem.Int32有符号32位数
uintSystem.UInt32无符号32位数
longSystem.Int64有符号64位数
ulongSystem.UInt64无符号64位数
charSystem.Char16位Unicode字符,占2个字节长度
float  System.SingleIEEE32位浮点值
doubleSystem.DoubleIEEE64位浮点值
boolSystem.Boolean一个true/false值
decimalSystem.Decimal一个128位高精度浮点数
stringSystem.String一个字符数组
objectSystem.Object所有类型的基类型
dynamicSystem.Object对于CLR,dynamic和object是完全一致的。
三、类型之间的转换  

Int32 i = 5;

Int64 l = i;

只有在转换"安全"的时候,C#才允许隐式转换。所谓"安全",是指不会发生数据丢失的情况。比如从Int32转换为Int64。然而,如果一次转换有可能是不安全的,C#就要求进行显式转换。需要注意的是,不同的编译器可能生成不同的代码来处理转型操作。例如,将值为6.8的一个Single转型为一个Int32时,有的编译器可能生成代码,对其进行截断处理,最终将6放到Int32中,有的编译器可能将结果向上取整为7.C#总是对结果进行截断处理,而不进行向上取整。

对基元类型执行的许多算术运算都有可能造成溢出:

Byte b = 100;

b = (Byte)(b + 200);

在大多数编程情形中,这种悄然发生的溢出是我们不希望的,如果没有检测到这种溢出,会导致应用程序行为失常。CLR提供了一些特殊的IL指令,允许编译器选择它认为最恰当的行为。CLR有一个add指令,作用是将两个值加到一起,但不执行溢出检查,CLR还有一个add.ovf指令,作用也是将两个值加到一起,但会在发生溢出时抛出OverflowException异常。除了用于加法运算的这两个IL指令,CLR还有其他运算提供了类似的功能。

C#允许程序员自己决定如何处理溢出,溢出检查默认是关闭的。也就是说,编译器在生成IL代码时,会自动使用四则运算不含溢出检查的版本。这样的结果是代码能够更快的运行。但是,开发人员必须保证不会发生溢出,或者他们的代码能预见到这些溢出。让C#编译器控制溢出的一个办法是使用/checked+编译器开关,在Visual Studio中更改Checked设置,请打开项目的属性对话框,选择"生成"选项卡,单击"高级",再勾选"检查运算上溢/下溢"。除了上面这种全局性的打开或关闭溢出检查,程序员还可在代码的特定区域灵活的控制溢出检查。C#通过提供的checked/unchecked操作符来实现这种灵活性。

Byte b = 100;

b = checked((Byte)(b + 200));

除了checked/unchecked操作符,C#还支持checked/unchecked语句,它们造成块中的所有表达式都进行或不进行溢出检查。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: