C#入门之checked和unchecked的区别实例解析

拾光
拾光
发布时间:2026-10-14| 4人浏览过
原创

在C#编程中,整数类型(如int)的范围是固定的。当计算结果超出该范围时,系统默认行为可能导致数据错误且难以察觉。checked和unchecked是C#提供的两个关键字,用于控制算术运算、转换或显式转换操作中的溢出检查行为。掌握它们的区别,能有效防止隐蔽的Bug,提高程序安全性。

整数溢出的默认现象

int类型的最大值为2147483647。如果尝试将两个最大值相加,结果会超出上限。在未进行特殊配置的情况下,C#会忽略溢出并截断高位数据,导致结果变为一个负数。这往往不符合预期,尤其是在金融计算或精确计数场景中。

第1步:观察默认无检查时的溢出行为

目的:验证在没有checked或unchecked约束时,整数溢出的实际表现。

  • 入口:Visual Studio 或任何C#编译器环境
  • 动作:
    • 声明两个int变量并赋值为int.MaxValue(即2147483647)
    • 执行加法运算并打印结果
  • 重要参数:int y = 2147483647;, int x = 2147483647;
class Program
{
  static void Main(string[] args)
  {
    int y = 2147483647;
    int x = 2147483647;
    int z = x + y;
    Console.WriteLine(z.ToString());
    Console.ReadKey();
  }
}

运行上述代码,控制台输出结果为-2。这是因为发生了整数溢出,二进制表示的回绕导致了负值出现。这种现象被称为“静默失败”,对于初学者来说容易误以为计算正常。

具体运行效果如下图所示:

一、使用checked强制检查溢出

checked关键字用于显式启用溢出检查。当在该关键字包围的代码块或表达式中发生整数溢出时,运行时环境将抛出System.OverflowException异常,从而中断程序流程,提醒开发者存在逻辑错误。

第2步:应用checked捕获溢出异常

目的:演示如何使用checked识别并处理整数溢出问题。

  • 入口:C#代码编辑器
  • 动作:
    • 将溢出表达式包裹在checked语句中
    • 使用try...catch结构捕获OverflowException
  • 重要参数:checked(x + y)
class Program
{
  static void Main(string[] args)
  {
    int y = 2147483647;
    int x = 2147483647;
    try
    {
      int z = checked(x + y);
    }
    catch (OverflowException ex)
    {
      Console.WriteLine(ex.Message);
    }
    Console.ReadKey();
  }
}

执行此代码时,由于checked检测到溢出,不会返回错误的负数,而是直接进入catch块打印异常信息。这种机制有助于在开发阶段尽早发现数值越界bug。

抛出溢出异常的界面展示如下:

手动捕获并打印异常消息后的控制台输出示例:

二、使用unchecked保持静默模式

虽然大多数情况下建议开启溢出检查以保证安全,但在某些特定场景(如位运算、哈希算法或对性能极度敏感的底层循环)中,开发者可能希望保留默认的截断行为。此时可以使用unchecked关键字明确告诉编译器:“即使发生溢出,也不要抛出异常”。

第3步:在unchecked环境下执行运算

目的:展示如何显式禁用溢出检查以恢复默认行为。

  • 入口:C#代码编辑器
  • 动作:
    • 在表达式外包裹unchecked关键字
    • 正常获取运算结果
  • 重要参数:unchecked(x + y)
class Program
{
  static void Main(string[] args)
  {
    int y = 2147483647;
    int x = 2147483647;
    int z = unchecked(x + y);
    Console.WriteLine(z.ToString());
    Console.ReadKey();
  }
}

尽管这里显式指定了unchecked,但结果依然为-2。这是因为unchecked并未改变底层的数学运算逻辑,只是禁止了异常抛出的保护机制。它允许程序继续运行,但需由开发者自行确保数据截断符合业务需求。

总结

checked和unchecked的核心区别在于是否干预整数溢出时的异常处理:checked会主动报错以保障数据安全,适合常规业务逻辑;unchecked则维持静默截断,适用于需要兼容旧行为或追求极致性能的特殊算法。在实际开发中,默认构建配置通常开启溢出检查,合理使用这两个关键字能让你的C#代码更加健壮和可控。

以上就是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 算法库。