C#中checked關(guān)鍵字的使用小結(jié)
在 C# 中,checked 關(guān)鍵字用于 啟用整數(shù)算術(shù)溢出檢查。當運算結(jié)果超出目標類型的表示范圍時,checked 會拋出 OverflowException 異常,而不是靜默地產(chǎn)生錯誤結(jié)果。
與之對應(yīng)的是 unchecked(默認行為),它會忽略溢出,直接截斷高位,可能導(dǎo)致邏輯錯誤卻難以察覺。
? 為什么需要checked?
?? 問題:整數(shù)溢出是“靜默”的(默認)
int a = int.MaxValue; // 2147483647 int b = a + 1; // 溢出! Console.WriteLine(b); // 輸出: -2147483648(變成最小值?。?/pre>
? 這種“繞回”行為在金融、科學(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表達式
只對單個表達式啟用檢查:
int a = int.MaxValue; int b = checked(a + 1); // 拋出異常
3、編譯器選項(全局)
通過項目設(shè)置啟用全局 checked 模式(不常用):
<PropertyGroup> <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow> </PropertyGroup>
此時所有整數(shù)運算默認 checked,除非顯式用 unchecked 包裹。
??checkedvsunchecked對比
| 場景 | checked | unchecked(默認) |
|---|---|---|
| 溢出行為 | 拋出 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)。
常量表達式默認 checked
編譯器會在編譯期檢查常量溢出:
int x = int.MaxValue + 1; // 編譯錯誤!CS0220
但變量運算默認 unchecked:
int a = int.MaxValue; int y = a + 1; // 運行時靜默溢出(除非用 checked)
性能影響很小
現(xiàn)代 CPU 有溢出標志位,檢查開銷極低,安全關(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)先,后果自負”
| 關(guān)鍵點 | 說明 |
|---|---|
| 作用 | 捕獲整數(shù)溢出異常 |
| 默認行為 | unchecked(靜默溢出) |
| 推薦使用 | 金融、安全敏感、調(diào)試場景 |
| 替代方案 | 對超大數(shù)使用 System.Numerics.BigInteger |
?? 記住:
“在需要精確結(jié)果的地方,永遠不要信任默認的整數(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)隨機數(shù)猜數(shù)游戲的示例代碼
這篇文章主要介紹了使用c#實現(xiàn)隨機數(shù)猜數(shù)游戲的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
C# datagrid非常規(guī)方法實現(xiàn)添加合并列
這篇文章主要介紹了C# datagrid非常規(guī)方法實現(xiàn)添加合并列,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
C#使用Spire.XLS在Excel中創(chuàng)建數(shù)據(jù)透視表
在C#環(huán)境下進行Excel自動化,有多種方案可供選擇,例如Microsoft Office Interop、EPPlus等,但對于需要處理復(fù)雜Excel功能,尤其是數(shù)據(jù)透視表、圖表等高級特性,Spire.XLS憑借其獨特的優(yōu)勢脫穎而出,所以本文給大家介紹了如何使用Spire.XLS在Excel中創(chuàng)建數(shù)據(jù)透視表2025-09-09
通過LinQ查詢字符出現(xiàn)次數(shù)的實例方法
這篇文章主要介紹了通過LinQ查詢字符出現(xiàn)次數(shù)的實例方法,大家參考使用吧2013-11-11
C#使用RestSharp實現(xiàn)封裝常用的http請求方法
這篇文章主要為大家詳細介紹了C#如何使用RestSharp實現(xiàn)封裝常用的http請求方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2024-02-02

