总目录
一、概述
-
checked 和 unchecked 语句指定整型类型算术运算和转换的溢出检查上下文。
-
当发生整数算术溢出时,溢出检查上下文将定义发生的情况。
- 在已检查的上下文中,引发 System.OverflowException;
- 如果在常数表达式中发生溢出,则会发生编译时错误。
- 在未检查的上下文中,会通过丢弃任何不适应目标类型的高序位来将操作结果截断。
二、语句
checked
和unchecked
语句指定整型类型算术运算和转换的溢出检查上下文。
具体使用见下面案例:
static void Main(string[] args){uint a = uint.MaxValue;//【一】检查代码段 unchecked{ }unchecked{Console.WriteLine(a + 1); // output: 0}try{checked{Console.WriteLine(a + 1);}}catch (OverflowException e){Console.WriteLine(e.Message); // output: 算术运算导致溢出。}//由上可知,当我们使用checked的时候会做溢出检查,会抛出异常// 当我们使用unchecked的时候不会做溢出检查,不会有异常
三、表达式
- 若要为表达式指定溢出检查上下文,还可以使用 checked 和 unchecked 运算符
具体使用见下面案例:
//【二】检查表达式 unchecked()double d = double.MaxValue;int i = unchecked((int)d);Console.WriteLine(i); // output: -2147483648try{i = checked((int)d);}catch (OverflowException e){Console.WriteLine(e.Message); // output: 算术运算导致溢出。}Console.ReadLine();}
四、本地函数与 Checked
- checked 和 unchecked 语句和运算符仅影响以文本形式存在于语句块或运算符括号内的操作的溢出检查上下文
具体使用见下面案例:
static void Main(string[] args){int Multiply(int a, int b) => a * b;int factor = 2;try{checked{Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2}}catch (OverflowException e){Console.WriteLine(e.Message);}try{checked{Console.WriteLine(Multiply(factor, factor * int.MaxValue));}}catch (OverflowException e){Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.}}
internal class Program{static void Main(string[] args){int factor = 2;try{checked{Console.WriteLine(Multiply2(factor, int.MaxValue)); // output: -2}}catch (OverflowException e){Console.WriteLine(e.Message);}try{checked{Console.WriteLine(Multiply2(factor, factor * int.MaxValue));}}catch (OverflowException e){Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.}}private static int Multiply2(int a, int b){return a * b;}}
注意,在前面的示例中:
- 有一个本地函数
Multiply
,一个正常的私有函数Multiply2
- 当使用
Console.WriteLine(Multiply2(factor, int.MaxValue));
这样的方式调用 本地函数Multiply
或私有函数Multiply2
,checked 语句不会引发任何异常。 - 当使用
Console.WriteLine(Multiply2(factor, factor * int.MaxValue));
这样的方式调用 本地函数Multiply
或私有函数Multiply2
,由于第二个参数 的表达式 会引起 checked 语句的上下文检查,因此会引发异常。
static void Main(string[] args){int Multiply(int a, int b) => a * b;int factor = 2;try{unchecked{Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2}}catch (OverflowException e){Console.WriteLine(e.Message);}try{unchecked{Console.WriteLine(Multiply(factor, factor * int.MaxValue)); // output: -4}}catch (OverflowException e){Console.WriteLine(e.Message); }}
- unchecked 则都不会引发异常。
结语
回到目录页:C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
已选中和未选中的语句(C# 参考)