—— 数据精度保卫战中的checked与unchecked秘籍
int
→long
)(int)3.14
)long
→int
)️ 溢出检测:程序安全的守门人
默认情况下,C#处于 unchecked
上下文(不检测溢出)。需主动启用安全检测:
操作方式 | 语法示例 | 作用 |
---|---|---|
运算符 | checked(expr) |
单表达式溢出时抛OverflowException |
语句块 | checked { ... } |
整段代码启用溢出检测 |
禁用检测 | unchecked(expr) |
强制忽略溢出(结果可能异常) |
// 经典案例对比
ushort sh = 2000;
byte sb;
// 不检测:丢失高位字节 → 输出208
sb = unchecked((byte)sh);
// 检测:溢出时崩溃 → 抛出OverflowException
sb = checked((byte)sh);
checked
与unchecked
可多层嵌套,精准控制风险范围:
checked {
unchecked { /* 此处允许溢出 */ }
checked { /* 此处严格检测 */ }
}
unchecked
:直接截断高位(如 0x1234
→ 0x34
)checked
:溢出必抛异常 ```mermaid
graph LR
A[值超出目标范围] --> B{checked?}
B -->|Yes| C[抛OverflowException]
B -->|No| D[结果未定义!]
```
OverflowException
(无unchecked
豁免权!)[图2:显式数字转换规则矩阵 | 展示各类型转换风险点]
[图3:浮点转整数流程示意图 | 突出截断与溢出逻辑]
checked
,在Program.cs
中添加:Checked.Enable(); // .NET 6+全局启用检测
unchecked
提升性能(如加密计算)// 先检查范围再转换
double d = 1e20;
if (d >= float.MinValue && d <= float.MaxValue)
{
float safeFloat = (float)d;
}