国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

使用checked語句防止數(shù)據(jù)溢出的解決方法

2020-01-24 03:19:21
字體:
供稿:網(wǎng)友
在C#中有一個(gè)關(guān)鍵字checked,它用來判斷當(dāng)前上下文中的數(shù)值運(yùn)算和數(shù)值轉(zhuǎn)換是否會(huì)溢出。如是是常量溢出,那在編譯時(shí)就能發(fā)現(xiàn);如果是變量溢出,那在運(yùn)行時(shí)會(huì)拋出OverflowException。
數(shù)值運(yùn)算有:++   ―   - (unary)   +   -   *   /

有了這個(gè)就不用擔(dān)心數(shù)據(jù)溢出了。

checked
checked 有兩種使用方法:
1.作為操作符來使用
復(fù)制代碼 代碼如下:

int a = int.MinValue;
int c = checked(a--);

執(zhí)行的時(shí)候會(huì)拋出異常:

image

2.檢查一大塊代碼:
這樣子會(huì)對(duì)里面所有的代碼都做檢查
復(fù)制代碼 代碼如下:

checked
{
    int a = int.MinValue;
    int c = a--;
}

如下圖:

image

unchecked
和checked對(duì)應(yīng),還有一個(gè)unchecked關(guān)鍵字,用來取消檢查。
也是兩種使用;
1.作為運(yùn)算符:

復(fù)制代碼 代碼如下:

int a = int.MinValue;
int c = unchecked(a--);

這樣子就不會(huì)拋異常了

image

2.檢查一大塊代碼

復(fù)制代碼 代碼如下:

unchecked
{
    int a = int.MinValue;
    int c = a--;
}

也不拋異常:

image

/checked 和/checked-
如果代碼里總是要寫這么多checked語句是不是很煩?如果能有一個(gè)編譯參數(shù)就好,只有設(shè)置了就都會(huì)檢查。微軟也想到了這個(gè),它提供了一個(gè)/checked 參數(shù)來做,也提供了一個(gè)/checked-來取消。
•溢出檢查 /checked,也可以是/checked+
•溢出不檢查 /checked-
當(dāng)然,你想取消所有的檢查也是可以的,命令行參數(shù)是/checked-
復(fù)制代碼 代碼如下:

csc t2.cs /checked

其中csc是編譯器csc.exe , t2.cs 是被編譯的代碼文件。
我想很多人是用Visual Studio吧。VS里也是可以設(shè)置的。
步驟如下,我以VS2010為例,(VS2005,2008差不多)
1。在工程上點(diǎn)右鍵,選擇菜單Properties

image

2。點(diǎn)擊“Build”,再點(diǎn)擊“Advanced”

image

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

image

幾個(gè)注意
1.checked語句只對(duì)當(dāng)前上下文中的代碼有效,即不對(duì)調(diào)用的函數(shù)內(nèi)部做檢查。

復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
    checked
    {
        TestFun();
    }
}
static void TestFun()
{
    int a = int.MinValue;
    int c = a--;
}

這段代碼中。不會(huì)跑異常,因?yàn)閏hecked關(guān)鍵字沒有影響到TestFun內(nèi)部。如果需要這么做的話,要么在TestFun內(nèi)部加checked關(guān)鍵字,要么打開全局開關(guān)(加編譯參數(shù)/checked或者VS中設(shè)置)。
2.checked,unchecked關(guān)鍵字不檢查左移和右移是否溢出。
復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
    checked
    {
        int a = int.MinValue;
        int c = a>>1;
    }
}

執(zhí)行不會(huì)拋異常:

image

3.為了性能考慮,建議Debug時(shí)做檢查,Release時(shí)不做檢查。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 奇台县| 宜昌市| 雷山县| 吉安县| 余庆县| 安庆市| 绥阳县| 临湘市| 桂东县| 绍兴县| 深州市| 贵南县| 黄石市| 四子王旗| 水城县| 肃宁县| 玉树县| 龙海市| 自治县| 龙海市| 应城市| 东山县| 青冈县| 五大连池市| 宜宾县| 大安市| 黑河市| 林甸县| 扬中市| 同江市| 惠水县| 达拉特旗| 买车| 泸溪县| 马鞍山市| 泸水县| 桑日县| 金沙县| 屏南县| 凌海市| 白沙|