使用checked語句防止數(shù)據(jù)溢出的解決方法
更新時間:2013年05月18日 09:33:12 作者:
本篇文章是對用checked語句防止數(shù)據(jù)溢出的解決方法進行了詳細的分析介紹,需要的朋友參考下
在C#中有一個關鍵字checked,它用來判斷當前上下文中的數(shù)值運算和數(shù)值轉(zhuǎn)換是否會溢出。如是是常量溢出,那在編譯時就能發(fā)現(xiàn);如果是變量溢出,那在運行時會拋出OverflowException。
數(shù)值運算有:++ — - (unary) + - * /
有了這個就不用擔心數(shù)據(jù)溢出了。
checked
checked 有兩種使用方法:
1.作為操作符來使用
int a = int.MinValue;
int c = checked(a--);
執(zhí)行的時候會拋出異常:
這樣子會對里面所有的代碼都做檢查
checked
{
int a = int.MinValue;
int c = a--;
}
如下圖:
int a = int.MinValue;
int c = unchecked(a--);
這樣子就不會拋異常了
unchecked
{
int a = int.MinValue;
int c = a--;
}
也不拋異常:
如果代碼里總是要寫這么多checked語句是不是很煩?如果能有一個編譯參數(shù)就好,只有設置了就都會檢查。微軟也想到了這個,它提供了一個/checked 參數(shù)來做,也提供了一個/checked-來取消。
•溢出檢查 /checked,也可以是/checked+
•溢出不檢查 /checked-
當然,你想取消所有的檢查也是可以的,命令行參數(shù)是/checked-
csc t2.cs /checked
其中csc是編譯器csc.exe , t2.cs 是被編譯的代碼文件。
我想很多人是用Visual Studio吧。VS里也是可以設置的。
步驟如下,我以VS2010為例,(VS2005,2008差不多)
1。在工程上點右鍵,選擇菜單Properties
static void Main(string[] args)
{
checked
{
TestFun();
}
}
static void TestFun()
{
int a = int.MinValue;
int c = a--;
}
這段代碼中。不會跑異常,因為checked關鍵字沒有影響到TestFun內(nèi)部。如果需要這么做的話,要么在TestFun內(nèi)部加checked關鍵字,要么打開全局開關(加編譯參數(shù)/checked或者VS中設置)。
2.checked,unchecked關鍵字不檢查左移和右移是否溢出。
static void Main(string[] args)
{
checked
{
int a = int.MinValue;
int c = a>>1;
}
}
執(zhí)行不會拋異常:
數(shù)值運算有:++ — - (unary) + - * /
有了這個就不用擔心數(shù)據(jù)溢出了。
checked
checked 有兩種使用方法:
1.作為操作符來使用
復制代碼 代碼如下:
int a = int.MinValue;
int c = checked(a--);
執(zhí)行的時候會拋出異常:
這樣子會對里面所有的代碼都做檢查
復制代碼 代碼如下:
checked
{
int a = int.MinValue;
int c = a--;
}
如下圖:

unchecked
和checked對應,還有一個unchecked關鍵字,用來取消檢查。
也是兩種使用;
1.作為運算符:
復制代碼 代碼如下:
int a = int.MinValue;
int c = unchecked(a--);
這樣子就不會拋異常了

2.檢查一大塊代碼
復制代碼 代碼如下:
unchecked
{
int a = int.MinValue;
int c = a--;
}
也不拋異常:

如果代碼里總是要寫這么多checked語句是不是很煩?如果能有一個編譯參數(shù)就好,只有設置了就都會檢查。微軟也想到了這個,它提供了一個/checked 參數(shù)來做,也提供了一個/checked-來取消。
•溢出檢查 /checked,也可以是/checked+
•溢出不檢查 /checked-
當然,你想取消所有的檢查也是可以的,命令行參數(shù)是/checked-
復制代碼 代碼如下:
csc t2.cs /checked
其中csc是編譯器csc.exe , t2.cs 是被編譯的代碼文件。
我想很多人是用Visual Studio吧。VS里也是可以設置的。
步驟如下,我以VS2010為例,(VS2005,2008差不多)
1。在工程上點右鍵,選擇菜單Properties

2。點擊“Build”,再點擊“Advanced”

3。在打開的對話框中,把“Check for arithmetic overflow/underflow”打上勾

幾個注意
1.checked語句只對當前上下文中的代碼有效,即不對調(diào)用的函數(shù)內(nèi)部做檢查。
復制代碼 代碼如下:
static void Main(string[] args)
{
checked
{
TestFun();
}
}
static void TestFun()
{
int a = int.MinValue;
int c = a--;
}
這段代碼中。不會跑異常,因為checked關鍵字沒有影響到TestFun內(nèi)部。如果需要這么做的話,要么在TestFun內(nèi)部加checked關鍵字,要么打開全局開關(加編譯參數(shù)/checked或者VS中設置)。
2.checked,unchecked關鍵字不檢查左移和右移是否溢出。
復制代碼 代碼如下:
static void Main(string[] args)
{
checked
{
int a = int.MinValue;
int c = a>>1;
}
}
執(zhí)行不會拋異常:

3.為了性能考慮,建議Debug時做檢查,Release時不做檢查。
相關文章
Winform界面中實現(xiàn)菜單列表的動態(tài)個性化配置管理方法
下面小編就為大家分享一篇Winform界面中實現(xiàn)菜單列表的動態(tài)個性化配置管理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
詳解如何利用C#實現(xiàn)漢字轉(zhuǎn)拼音功能
這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)漢字轉(zhuǎn)拼音的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12

