在 c# 中,checked 关键字用于 启用整数算术溢出检查。当运算结果超出目标类型的表示范围时,checked 会抛出 overflowexception 异常,而不是静默地产生错误结果。
与之对应的是 unchecked(默认行为),它会忽略溢出,直接截断高位,可能导致逻辑错误却难以察觉。
✅ 为什么需要checked?
📌 问题:整数溢出是“静默”的(默认)
int a = int.maxvalue; // 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关键字内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论