十二:checked和unchecked
简单来说checked和unchecked操作符用于整型算术运算时控制当前环境中的
溢出检查。看以下代码:(注:Byte为无符号8位值,0到255)
(1)
Byte b = 400;
b = (Byte)(b + 400);
(2)
Byte b = 200;
b = (Byte)(b + 200);
(3)
Byte b = 200;
b = checked((Byte)(b + 200));
(4)
Byte b = 200;
b = (Byte)checked(b + 200);
说明:
(1)编译第一行就通不过,常量值“400”无法转换为“byte”
(2)编译通过,此时b的值为144。该代码执行时第一步要求所有操作数都扩展为32位值,如果不够的话再扩展为64位,所以b和200首先转换成32位的值,然后再加到一起,结果是一个32位的400,该值在存回到变量b之前,必须显示转换成Byte。
(3)做益出检查,抛出OverflowException异常。
(4)编译通过,b为144。
C#编译器默认的是不进行益出检查(unchecked),因为益出检查会造成一定性能的损失。
C#还支持checked和unchecked语句块,如下:
checked
{
Byte b = 200;
b = (Byte)(b + 200);
}
System.Decimal类型是一个非常特殊的类型,它对cheched和unchecked都失去效用。