C#中checked与unchecked关键字详解:控制整数溢出行为

巷口听风
巷口听风
发布时间:2026-10-14| 6人浏览过
原创

在C#语言中,checked和unchecked关键字用于显式控制整数算术运算时的溢出检查行为。当整数运算结果超出数据类型范围时,checked会抛出System.OverflowException异常以确保安全,而unchecked则会静默截断高位数据仅保留低位结果。合理运用这两个关键字有助于平衡程序的安全性与性能。

为什么需要控制溢出?

在进行整数类型(如int、byte)的加减乘除或类型转换时,如果结果超出了该类型的取值范围,就会发生“算术溢出”。在某些算法(如哈希计算、加密逻辑)中,溢出并非错误而是预期行为;但在常规业务逻辑中,溢出往往导致不可预知的Bug。C#提供了机制让用户选择何时抛出异常以拦截错误,何时允许静默溢出以提升性能。

核心概念解析

第1步:使用 checked 触发溢出异常

目的:在关键代码块或表达式中启用溢出检查,确保数值安全。
动作:在代码语句前添加checked关键字,或使用checked(...)包裹表达式。
结果:若运算产生溢出,运行时将抛出System.OverflowException中断流程。

第2步:使用 unchecked 静默处理溢出

目的:执行不需要安全检查的高性能运算,或者模拟硬件层面的位操作。
动作:在代码语句前添加unchecked关键字,或使用unchecked(...)包裹表达式。
结果:溢出发生时不抛异常,直接丢弃超出位数的高位部分,返回低位的十进制整数值。

代码对比演示

以下示例展示了同一组大数乘法在两种不同模式下的表现。

复制代码 代码如下:
using System;

class Test {
    static void Main() {
        int num1 = 100000;
        int num2 = 100000;
        int result = 0;

        // 使用 checked 块
        checked {
            try {
                result = num1 * num2; 
                // 理论上结果应为 10,000,000,000,超出 int 最大值 (2,147,483,647)
            } catch (System.OverflowException e) {
                Console.WriteLine("Checked: " + e.Message);
            } finally {
                Console.WriteLine("Checked Result: " + result);
            }
        }

        // 使用 unchecked 块
        unchecked {
            try {
                result = num1 * num2;
            } catch (System.OverflowException e) { 
                // 此处不会进入catch,因为unchecked不抛异常
                Console.WriteLine("Unchecked: " + e.Message);
            } finally {
                Console.WriteLine("Unchecked Result: " + result);
            }
        }
    }
}

上述代码的输出结果为:

输出结果
Cheched: System.OverflowException: Arithmetic operation resulted in an overflow.
Checked Result: 0
Unchecked Result: 1410065408

可以看到,checked成功捕获了溢出并打印了异常信息,变量保持初始值0;而unchecked直接计算出了溢出后的低位值1410065408,程序继续正常运行。

编译器默认行为与全局设置

  • 默认行为:如果没有指定checked或unchecked,且未修改编译器选项,C#默认处于unchecked模式,即允许静默溢出。
  • 编译器选项:/checked如果在编译时使用/checked参数,整个文件的所有算术运算将默认开启溢出检查。此时,除非显式使用unchecked包裹,否则所有运算都会抛出异常。
  • 优先级:代码中的checked/unchecked修饰符优先于编译器选项。即使开启了全局检查,被unchecked标记的代码依然不会抛出异常。

使用建议

在涉及用户输入、边界条件复杂的财务或计数逻辑中,建议广泛使用checked以尽早发现数据错误。而在底层位运算、数组索引计算或已知安全的循环计数器中,可使用unchecked避免不必要的异常开销。

以上就是C#中checked与unchecked关键字的详细内容,更多关于C#整数溢出控制的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。