C# checked和unchecked的使用小结

 更新时间:2025年07月31日 10:38:55   作者:鲤籽鲲  
C#中checked和unchecked控制整型运算溢出检查,检查上下文引发异常或编译错误,下面就来具体介绍一下checked和unchecked的使用,感兴趣的可以了解一下

一、概述

  • checked 和 unchecked 语句指定整型类型算术运算和转换的溢出检查上下文。

  • 当发生整数算术溢出时,溢出检查上下文将定义发生的情况。

    • 在已检查的上下文中,引发 System.OverflowException;
    • 如果在常数表达式中发生溢出,则会发生编译时错误。
    • 在未检查的上下文中,会通过丢弃任何不适应目标类型的高序位来将操作结果截断。

二、语句

  • checkedunchecked 语句指定整型类型算术运算和转换的溢出检查上下文。

具体使用见下面案例:

     	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# 参考)

到此这篇关于C# checked和unchecked的使用小结的文章就介绍到这了,更多相关C# checked unchecked 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#删除文件夹和文件到回收站示例

    C#删除文件夹和文件到回收站示例

    本文介绍了C#删除文件和文件夹到回收站的方法,平时都是使用File.Delete方法删除文件,这样删除之后就真没有了。下面的代码可以将文件删除放到回收站里
    2014-01-01
  • Unity实现微信聊天框界面

    Unity实现微信聊天框界面

    这篇文章主要为大家详细介绍了Unity实现微信聊天框界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C# 使用SharpZipLib生成压缩包的实例代码

    C# 使用SharpZipLib生成压缩包的实例代码

    SharpZipLib是一个C#的类库,主要用来解压缩Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中。本文通过一个实例代码给大家介绍了C# 使用SharpZipLib生成压缩包的方法,感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • C# Telnet协议实现与源码解析

    C# Telnet协议实现与源码解析

    本文主要介绍了C# Telnet协议实现与源码解析,包括创建Socket连接、命令交互、数据传输和异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • C#调用OutLokk实现发送邮件

    C#调用OutLokk实现发送邮件

    这篇文章主要为大家详细介绍了如何利用C#调用OutLokk实现发送邮件的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# 打开蓝牙设置界面的两种方法

    C# 打开蓝牙设置界面的两种方法

    这篇文章主要介绍了C# 打开蓝牙设置界面的两种方法,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#获取应用程序路径或Web页面目录路径

    C#获取应用程序路径或Web页面目录路径

    这篇文章介绍了C#获取应用程序路径或Web页面目录路径的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#下listview如何插入图片

    C#下listview如何插入图片

    这篇文章主要为大家详细介绍了C#下listview如何插入图片,如何在listview中插入图片的每一个步骤为大家分享,感兴趣的朋友可以参考一下
    2016-05-05
  • C#使用itextsharp打印pdf的实现代码

    C#使用itextsharp打印pdf的实现代码

    提到打印,恐怕对于很多人都不会陌生,无论是开发者,还是非计算机专业的人员都会接触到打印, 在.NET中实现PDF打印的组件比较多,例如PDFsharp、Report.NET、sharpPDF、itextSharp等等,今天主要简单的介绍itextSharp组件,需要的朋友可以参考下
    2024-04-04
  • C#创建Excel多级分组的方法

    C#创建Excel多级分组的方法

    这篇文章主要为大家详细介绍了C#创建Excel多级分组的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论