本文主要是介绍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对比
| 场景 | checked | unchecked(默认) |
|---|---|---|
| 溢出行为 | 抛出 OverflowException | 静默截断(wrap-around) |
| 性能 | 略低(需检查) | 略高(无检查) |
| 安全性 | ✅ 高(及时暴露错误) | ❌ 低(可能隐藏 bug) |
| 典型用途 | 金融计算、关键数据处理 | 图形/游戏(允许绕回)、性能敏感场景 |
实际应用场景
✅ 推荐使用checked的情况:
- 金融系统(金额计算不能出错)
- 科学计算(精度要求高)
- 用户输入的数值运算(防止恶意大数攻击)
- 调试阶段(快速发现潜在溢出 bug)
✅ 示例:安全的加法函数
public static int SafeAdd(int a, int b)
{
try
{
return checked(a + b);
}
catch (OverflowException)
{
throw new ArgumentException("计算结果溢出!");
}
}⚠️ 注意事项
仅对整数类型有效checked 对 float/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关键字的使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!