当前位置: 代码网 > it编程>编程语言>Asp.net > C# checked和unchecked的使用小结

C# checked和unchecked的使用小结

2025年07月31日 Asp.net 我要评论
一、概述checked 和 unchecked 语句指定整型类型算术运算和转换的溢出检查上下文。当发生整数算术溢出时,溢出检查上下文将定义发生的情况。在已检查的上下文中,引发 system.overf

一、概述

  • 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 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com