C#中checked關(guān)鍵字的使用小結(jié)
在 C# 中,checked 關(guān)鍵字用于 啟用整數(shù)算術(shù)溢出檢查。當(dāng)運(yùn)算結(jié)果超出目標(biāo)類型的表示范圍時(shí),checked 會(huì)拋出 OverflowException 異常,而不是靜默地產(chǎn)生錯(cuò)誤結(jié)果。
與之對(duì)應(yīng)的是 unchecked(默認(rèn)行為),它會(huì)忽略溢出,直接截?cái)喔呶?,可能?dǎo)致邏輯錯(cuò)誤卻難以察覺。
? 為什么需要checked?
?? 問題:整數(shù)溢出是“靜默”的(默認(rèn))
int a = int.MaxValue; // 2147483647 int b = a + 1; // 溢出! Console.WriteLine(b); // 輸出: -2147483648(變成最小值!)
? 這種“繞回”行為在金融、科學(xué)計(jì)算等場(chǎng)景中可能是災(zāi)難性的!
??checked的三種用法
1、checked語句塊
對(duì)一段代碼啟用溢出檢查:
try
{
checked
{
int a = int.MaxValue;
int b = a + 1; // 拋出 OverflowException!
}
}
catch (OverflowException ex)
{
Console.WriteLine("發(fā)生溢出:" + ex.Message);
}2、checked表達(dá)式
只對(duì)單個(gè)表達(dá)式啟用檢查:
int a = int.MaxValue; int b = checked(a + 1); // 拋出異常
3、編譯器選項(xiàng)(全局)
通過項(xiàng)目設(shè)置啟用全局 checked 模式(不常用):
<PropertyGroup> <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow> </PropertyGroup>
此時(shí)所有整數(shù)運(yùn)算默認(rèn) checked,除非顯式用 unchecked 包裹。
??checkedvsunchecked對(duì)比
| 場(chǎng)景 | checked | unchecked(默認(rèn)) |
|---|---|---|
| 溢出行為 | 拋出 OverflowException | 靜默截?cái)啵╳rap-around) |
| 性能 | 略低(需檢查) | 略高(無檢查) |
| 安全性 | ? 高(及時(shí)暴露錯(cuò)誤) | ? 低(可能隱藏 bug) |
| 典型用途 | 金融計(jì)算、關(guān)鍵數(shù)據(jù)處理 | 圖形/游戲(允許繞回)、性能敏感場(chǎng)景 |
?? 實(shí)際應(yīng)用場(chǎng)景
? 推薦使用checked的情況:
- 金融系統(tǒng)(金額計(jì)算不能出錯(cuò))
- 科學(xué)計(jì)算(精度要求高)
- 用戶輸入的數(shù)值運(yùn)算(防止惡意大數(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("計(jì)算結(jié)果溢出!");
}
}?? 注意事項(xiàng)
僅對(duì)整數(shù)類型有效checked 對(duì) float/double 無效(它們遵循 IEEE 754,溢出會(huì)變成 Infinity)。
常量表達(dá)式默認(rèn) checked
編譯器會(huì)在編譯期檢查常量溢出:
int x = int.MaxValue + 1; // 編譯錯(cuò)誤!CS0220
但變量運(yùn)算默認(rèn) unchecked:
int a = int.MaxValue; int y = a + 1; // 運(yùn)行時(shí)靜默溢出(除非用 checked)
性能影響很小
現(xiàn)代 CPU 有溢出標(biāo)志位,檢查開銷極低,安全關(guān)鍵場(chǎng)景應(yīng)優(yōu)先考慮正確性。
? 最佳實(shí)踐建議
| 場(chǎng)景 | 建議 |
|---|---|
| 一般業(yè)務(wù)邏輯 | 在關(guān)鍵計(jì)算處顯式使用 checked |
| 高性能循環(huán)(如游戲) | 可用 unchecked 避免檢查開銷 |
| 庫開發(fā) | 對(duì)外 API 使用 checked 保證健壯性 |
| 不確定是否溢出 | 用 checked + 異常處理,或改用 BigInteger |
?? 總結(jié)
- checked = “寧可崩潰,也不返回錯(cuò)誤結(jié)果”
- unchecked = “速度優(yōu)先,后果自負(fù)”
| 關(guān)鍵點(diǎn) | 說明 |
|---|---|
| 作用 | 捕獲整數(shù)溢出異常 |
| 默認(rèn)行為 | unchecked(靜默溢出) |
| 推薦使用 | 金融、安全敏感、調(diào)試場(chǎng)景 |
| 替代方案 | 對(duì)超大數(shù)使用 System.Numerics.BigInteger |
?? 記住:
“在需要精確結(jié)果的地方,永遠(yuǎn)不要信任默認(rèn)的整數(shù)運(yùn)算。”
用 checked 為你的關(guān)鍵計(jì)算加上安全鎖!
到此這篇關(guān)于C#中checked關(guān)鍵字的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# checked關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)指定的網(wǎng)頁進(jìn)行截圖的效果 C#版
對(duì)指定的網(wǎng)頁進(jìn)行截圖的效果 C#版...2007-08-08
C#實(shí)現(xiàn)基于XML配置MenuStrip菜單的方法
這篇文章主要介紹了C#實(shí)現(xiàn)基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#使用Spire.Doc自動(dòng)化插入圖片到Word文檔
還在為 Word 文檔中圖片的手動(dòng)插入而煩惱嗎?無論是生成批量報(bào)告、合同模板,還是動(dòng)態(tài)展示數(shù)據(jù),程序化地將圖片嵌入Word文檔都是開發(fā)者們常常面臨的挑戰(zhàn),本文將深入探討如何利用強(qiáng)大的第三方庫 Spire.Doc for .NET,在C#項(xiàng)目中高效、靈活地實(shí)現(xiàn)Word文檔的圖片插入2026-02-02
基于C#實(shí)現(xiàn)端口掃描器(單線程和多線程)
本文主要介紹了基于C#分別通過單線程和多線程實(shí)現(xiàn)端口掃描,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

