C#中checked关键字的使用小结

2025-12-12 19:50

本文主要是介绍C#中checked关键字的使用小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学...

C# 中,checked 关键字用于 启用整数算术溢出检查。当运算结果超出目标类型的表示范围时,checked 会抛出 OverflowException 异常,而不是静默地产生错误结果。

与之对应的是 unchecked(默认行为),它会忽略溢出,直接截断高位编程China编程,可能导致逻辑错误却难以察觉。

✅ 为什么需要checked?

问题:整数溢出是“静默”的(默认)

int a = int.MaxValue; //http://www.chinasem.cn 2147483647
int b = a 编程+ 1;        // 溢出!
Console.WriteLine(b); // 输出: -2147483648(变成最小值!)

❗ 这种“绕回”行为在金融、科学计算等场景中可能是灾难性的!

checked的三种用法

1、checked语句块

对一段代码启用溢出检查:

try
{
    checked
    {
        int a = int.MaxValue;
    编程    int b = a + 1; // 抛出 OverflowException!
    }
}
catch (OverflowException ex)
{
    Console.WriteLine("发生溢出:" + ex.Message);
}

2、checked表达式

只对单个表达式启用检查:

int a = int.MaxValue;
int b = checked(a + 1); // 抛出异常

3、编译器选项(全局)

通过项目设置启用全局 checked 模式(不常用):

<PropertyGroup>
  <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
</PropertyGroup>

此时所有整数运算默认 checked,除非显式用 unchecked 包裹。

checkedvsunchecked对比

场景checkedunchecked(默认)
溢出行为抛出 OverflowException静默截断(wrap-around)
性能略低(需检查)略高(无检查)
安全性✅ 高(及时暴露错误)❌ 低(可能隐藏 bug)
典型用途金融计算、关键数据处理图形/游戏(允许绕回)、性能敏感场景

实际应用场景

✅ 推荐使用checked的情况:

  • 金融系统(金额计算不能出错)
  • 科学计算(精度要求高)
  • 用户输入的数值运算(防止恶意大数攻击)
  • 调试阶段(快速发现潜在溢出 bug)

✅ 示例:安全的加法函数

public static int SafeAdd(int a, int b)
{
    try
    {
        return checked(a + b);
    }
    catch (OverflowException)
    {
        throw new ArgumentException("计算结果溢出!");
    }
}

⚠️ 注意事项

仅对整数类型有效
checkedfloat/double 无效(它们遵循 IEEE 754,溢出会变成 Infinity)。

常量表达式默认 checked
编译器会在编译期检查常量溢出:

int x = int.MaxValue + 1; // 编译错误!CS0220

但变量运算默认 unchecked:

int a = int.MaxValue;
int y = a + 1; // 运行时静默溢出(除非用 checked)

性能影响很小
现代 CPU 有溢出标志位,检查开销极低,安全关键场景应优先考虑正确性

✅ 最佳实践建议

场景建议
一般业务逻辑在关键计算处显式使用 checked
高性能循环(如游戏)可用 unchecked 避免检查开销
库开发对外 API 使用 checked 保证健壮性
不确定是否溢出用 checked + 异常处理,或改用 BigInteger

总结

  • checked = “宁可崩溃,也不返回错误结果”
  • unchecked = “速度优先,后果自负”
关键点说明
作用捕获整数溢出异常
默认行为unchecked(静默溢出)
推荐使用金融、安全敏感、调试场景
替代方案对超大数使用 System.Numerics.BigInteger

记住
“在需要精确结果的地方,永远不要信任默认的整数运算。”
用 checked 为你的关键计算加上安全锁!

到此这篇关于C#中checked关键字的使用小结的文章就介绍到这了,更多相关C# checked关键字内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C#中checked关键字的使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156436

相关文章

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req