C#中checked關(guān)鍵字的使用小結(jié)
在 C# 中,checked 關(guān)鍵字用于 啟用整數(shù)算術(shù)溢出檢查。當(dāng)運算結(jié)果超出目標(biāo)類型的表示范圍時,checked 會拋出 OverflowException 異常,而不是靜默地產(chǎn)生錯誤結(jié)果。
與之對應(yīng)的是 unchecked(默認(rèn)行為),它會忽略溢出,直接截斷高位,可能導(dǎo)致邏輯錯誤卻難以察覺。
? 為什么需要checked?
?? 問題:整數(shù)溢出是“靜默”的(默認(rèn))
int a = int.MaxValue; // 2147483647 int b = a + 1; // 溢出! Console.WriteLine(b); // 輸出: -2147483648(變成最小值!)
? 這種“繞回”行為在金融、科學(xué)計算等場景中可能是災(zāi)難性的!
??checked的三種用法
1、checked語句塊
對一段代碼啟用溢出檢查:
try
{
checked
{
int a = int.MaxValue;
int b = a + 1; // 拋出 OverflowException!
}
}
catch (OverflowException ex)
{
Console.WriteLine("發(fā)生溢出:" + ex.Message);
}2、checked表達(dá)式
只對單個表達(dá)式啟用檢查:
int a = int.MaxValue; int b = checked(a + 1); // 拋出異常
3、編譯器選項(全局)
通過項目設(shè)置啟用全局 checked 模式(不常用):
<PropertyGroup> <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow> </PropertyGroup>
此時所有整數(shù)運算默認(rèn) checked,除非顯式用 unchecked 包裹。
??checkedvsunchecked對比
| 場景 | checked | unchecked(默認(rèn)) |
|---|---|---|
| 溢出行為 | 拋出 OverflowException | 靜默截斷(wrap-around) |
| 性能 | 略低(需檢查) | 略高(無檢查) |
| 安全性 | ? 高(及時暴露錯誤) | ? 低(可能隱藏 bug) |
| 典型用途 | 金融計算、關(guān)鍵數(shù)據(jù)處理 | 圖形/游戲(允許繞回)、性能敏感場景 |
?? 實際應(yīng)用場景
? 推薦使用checked的情況:
- 金融系統(tǒng)(金額計算不能出錯)
- 科學(xué)計算(精度要求高)
- 用戶輸入的數(shù)值運算(防止惡意大數(shù)攻擊)
- 調(diào)試階段(快速發(fā)現(xiàn)潛在溢出 bug)
? 示例:安全的加法函數(shù)
public static int SafeAdd(int a, int b)
{
try
{
return checked(a + b);
}
catch (OverflowException)
{
throw new ArgumentException("計算結(jié)果溢出!");
}
}?? 注意事項
僅對整數(shù)類型有效checked 對 float/double 無效(它們遵循 IEEE 754,溢出會變成 Infinity)。
常量表達(dá)式默認(rèn) checked
編譯器會在編譯期檢查常量溢出:
int x = int.MaxValue + 1; // 編譯錯誤!CS0220
但變量運算默認(rèn) unchecked:
int a = int.MaxValue; int y = a + 1; // 運行時靜默溢出(除非用 checked)
性能影響很小
現(xiàn)代 CPU 有溢出標(biāo)志位,檢查開銷極低,安全關(guān)鍵場景應(yīng)優(yōu)先考慮正確性。
? 最佳實踐建議
| 場景 | 建議 |
|---|---|
| 一般業(yè)務(wù)邏輯 | 在關(guān)鍵計算處顯式使用 checked |
| 高性能循環(huán)(如游戲) | 可用 unchecked 避免檢查開銷 |
| 庫開發(fā) | 對外 API 使用 checked 保證健壯性 |
| 不確定是否溢出 | 用 checked + 異常處理,或改用 BigInteger |
?? 總結(jié)
- checked = “寧可崩潰,也不返回錯誤結(jié)果”
- unchecked = “速度優(yōu)先,后果自負(fù)”
| 關(guān)鍵點 | 說明 |
|---|---|
| 作用 | 捕獲整數(shù)溢出異常 |
| 默認(rèn)行為 | unchecked(靜默溢出) |
| 推薦使用 | 金融、安全敏感、調(diào)試場景 |
| 替代方案 | 對超大數(shù)使用 System.Numerics.BigInteger |
?? 記住:
“在需要精確結(jié)果的地方,永遠(yuǎn)不要信任默認(rèn)的整數(shù)運算。”
用 checked 為你的關(guān)鍵計算加上安全鎖!
到此這篇關(guān)于C#中checked關(guān)鍵字的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# checked關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)基于XML配置MenuStrip菜單的方法
這篇文章主要介紹了C#實現(xiàn)基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08

