当前位置: 首页 > article >正文

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


http://www.kler.cn/a/459745.html

相关文章:

  • log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
  • 【详解】AndroidWebView的加载超时处理
  • Appium2.0:发生了哪些重大变化?
  • MySQL 03 章——基本的SELECT语句
  • 系统设计——大文件传输方案设计
  • 【设计模式】 基本原则、设计模式分类
  • 安卓平台或者WEBGL平台编辑器内加载AB包紫色真机正常
  • 网页排名:PageRank 算法的前世今生
  • Android 模拟器系统镜像选择指南
  • 2024年API接口发展趋势:智能化、自动化引领电商数据流通
  • AndroidStudio之logcat使用技巧
  • PyTorch快速入门教程【小土堆】之土说卷积操作
  • MyBatis-Plus 中 @TableField 注解详解
  • JavaScript(五):JSON
  • 【大模型实战篇】Mac本地部署RAGFlow的踩坑史
  • 短视频平台的视频水印怎么去除?
  • Postman[7] 内置动态参数及自定义的动态参数
  • 【期末大作业】使用Python熟练掌握面向对象
  • 在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库
  • 如何修改 Angular 运行的主机和端口 ?
  • 中华人民共和国计算机信息系统安全保护条例
  • 微服务-服务保护和分布式事务
  • 如何利用Java爬虫获取亚马逊国际按关键字搜索商品
  • 安卓入门九 常用网络协议二
  • Casino Royale靶场wp
  • C语言初阶习题【19】三子棋游戏