天天看點

asp.net中checked和unchecked

  checked和unchecked操作符用于整型算術運算時控制目前環境中的溢出檢查。下列運算參與了checked和unchecked檢查(操作數均為整數):

  1)  預定義的++和――一進制運算符。

  2)  預定義的-一進制運算符。

  3)  預定義的+、-、×、/等二進制操作符。

  4)  從一種整型到另一種整型的顯示資料轉換。

  當上述整型運算産生一個目标類型無法表示的大數時,可以有相應的處理方式:

  (一)使用checked

  若運算是常量表達式,則産生編譯錯誤:The operation overflows at complie time in checked mode.

  若運算是非常量表達式,則運作時會抛出一個溢出異常:OverFlowException異常

  (二)使用unchecked

  無論運算是否是常量表達式,都沒有編譯錯誤或是運作時異常發生,隻是傳回值被截掉不符合目标類型的高位。

  (三)既未使用checked又未使用unchecked

  若運算是常量表達式,預設情況下總是進行溢出檢查,同使用checked一樣,會無法通過編譯。

  若運算是非常量表達式,則是否進行溢出檢查,取決于外部因素,包括編譯器狀态、執行環境參數等。

  下例說明了checked和unchecked操作符在非常量表達式中的使用方法:

class Test

{

       static int x = 1000000;

       static int y = 1000000;

       static int F()

{

       return checked(x*y);     //運作時抛出OverFlowException異常

}

static int G()

{

       return unchecked(x*y);  //截去高位部分,傳回-727379968

}

static int H()

{

       return x*y;     //依賴于編譯器的預設設定,一般是不檢查

}

}

  checked和unchecked操作符在常量表達式中的使用方法:

class Test

{

       const int x = 1000000;

       const int y = 1000000;

       static int F()

{

       return checked(x*y);     //編譯錯誤,編譯無法通過

}

static int G()

{

       return unchecked(x*y);  //截去高位部分,傳回-727379968

}

static int H()

{

       return x*y;     //編譯錯誤,編譯無法通過

}

}