C#每天一學(xué)之checked&unchecked

          checked和unchecked操作符用于整型算術(shù)運(yùn)算時控制當(dāng)前環(huán)境中的溢出檢查。下列運(yùn)算參與了checked和unchecked檢查(操作數(shù)均為整數(shù)):

          1)  預(yù)定義的++和―― 一元運(yùn)算符。

          2)  預(yù)定義的-一元運(yùn)算符。

          3)  預(yù)定義的+、-、×、/等二元操作符。

          4)  從一種整型到另一種整型的顯示數(shù)據(jù)轉(zhuǎn)換。

           

          (一)使用checked

          若運(yùn)算是常量表達(dá)式,則產(chǎn)生編譯錯誤:The operation overflows at complie time in checked mode.

          若運(yùn)算是非常量表達(dá)式,則運(yùn)行時會拋出一個溢出異常:OverFlowException異常。

          checked 的用法可以是checked(//運(yùn)算代碼),也可以是checked{//運(yùn)算代碼},一般都是小量的代碼。

          先看下面代碼:

                      Byte b = 100;

                      b 
          += 200;

                      Console.WriteLine(b.ToString());

           結(jié)果并不是我們預(yù)想的輸出300,輸出是44。假設(shè)我們用于計(jì)算那是多么的危險(xiǎn),上述代碼編譯時編譯器并沒有告訴程序員運(yùn)算溢出。而是偷偷的干了壞事...

          下面我們加上checked,看效果如何:

                      byte b = 200;
                      
          checked
                      { 
                          b 
          += 200;
                      }
                      Console.WriteLine( b.ToString());

          可以看到程序并沒有輸出,而是在運(yùn)行時拋出OverflowException,干了try catch的事情,告訴程序員說運(yùn)算溢出了,趕快修bug。在運(yùn)行時才拋出異常,在測試中帶來些許麻煩,那么如何在程序編譯時就拋出錯誤呢,事實(shí)上編譯時是不能確定運(yùn)算結(jié)果的,也就是說運(yùn)算結(jié)果是在運(yùn)行是才能確定,所以只有在運(yùn)行時checked才做運(yùn)算溢出檢查。但是下列代碼是編譯不通過的(地球人都知道)

                      byte b;
                      
          checked
                      {
                          b 
          = 256;
                      }
                      Console.WriteLine( b.ToString());

          輸出錯誤 Constant value '300' cannot be converted to a 'byte' ,byte的范圍是0~255嘛,編譯當(dāng)然報(bào)錯。

          需要指出的是,看下面代碼:

          Byte b = 100;
          = (Byte)checked(b + 200);//不拋出System.OverflowException異常信息

          這里解釋一下,因?yàn)?b+ 200 的結(jié)果是int32,checked是對int32的檢查當(dāng)然沒有運(yùn)算溢出,但是再將結(jié)果轉(zhuǎn)換成byte時沒有checked,所以返回值會被截掉不符合目標(biāo)類型的高位,輸出不正確的結(jié)果。

           

          (二)使用unchecked

          無論運(yùn)算是否是常量表達(dá)式,都沒有編譯錯誤或是運(yùn)行時異常發(fā)生,只是返回值被截掉不符合目標(biāo)類型的高位,用法類似checked。

          參考資料:

          [1]C#中的checked、unchecked操作符http://www.knowsky.com/301786.html

          [2]基元類型和Checked、UnChecked操作符的使用 http://www.cnblogs.com/noviceliu/archive/2009/03/11/1408461.html

          作者: 王德田 發(fā)表于 2011-02-28 18:01 原文鏈接

          評論: 0 查看評論 發(fā)表評論


          最新新聞:
          · Firefox 4 將是 Mozilla 最后一個大發(fā)行版(2011-03-01 17:06)
          · 凡客V+商城月均銷售額過6000萬(2011-03-01 16:33)
          · 未來,很好玩 —— 談下一代掌機(jī)(2011-03-01 16:31)
          · Red Hat改變內(nèi)核源代碼打包方式(2011-03-01 16:29)
          · 分析預(yù)計(jì)Facebook今年廣告營收將接近22億美元(2011-03-01 16:25)

          編輯推薦:在西方的程序員眼里,東方的程序員是什么樣的?

          網(wǎng)站導(dǎo)航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識庫

          posted on 2011-02-28 18:01 sanmao 閱讀(186) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 叙永县| 赫章县| 乌审旗| 五河县| 建湖县| 陆丰市| 洞头县| 门头沟区| 大姚县| 临猗县| 和顺县| 哈巴河县| 田林县| 门头沟区| 高尔夫| 平舆县| 海南省| 湘西| 临泉县| 自贡市| 茶陵县| 玛纳斯县| 迁西县| 南宫市| 墨竹工卡县| 竹山县| 新密市| 保定市| 金堂县| 驻马店市| 将乐县| 无极县| 海原县| 五河县| 临洮县| 桐城市| 华容县| 兰坪| 永新县| 西充县| 出国|