C# checked和unchecked的使用小结
作者:鲤籽鲲
C#中checked和unchecked控制整型运算溢出检查,检查上下文引发异常或编译错误,下面就来具体介绍一下checked和unchecked的使用,感兴趣的可以了解一下
一、概述
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: -2147483648
try
{
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# checked和unchecked的使用小结的文章就介绍到这了,更多相关C# checked unchecked 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
