程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#的checked和unchecked操作符

C#的checked和unchecked操作符

編輯:關於C#

checked和unchecked操作符用於整型算術運算時控制當前環境中的溢出檢查。下列運算參與了checked和uncheced檢查:

●預定義的++和--:一元操作符,當其操作數類型為整型時。

●預定義的-:一元操作符,當其操作數為整型數時。

●預定義的+、-、*、/等二元操作符,當兩個操作數數據類型都是整型。

●從一種整型到另一種整型地顯式數據轉換。

當上述運算之一產生一個目標類型無法表示的大數時,在使用了checked操作符的表達式中,如果運算是一個常量表達式,則產生運行時錯誤,否則,當運行時執行該運算時會溢出異常。而在使用了uncheced操作符的表達式中,返回值被截掉不符合目標類型的高位。

如果非常量表達式沒有被任何checked或unchecked操作符或語句所包括時,運行時計算該表達式的值,是否會產生溢出,依據於外部因素,如編譯器狀態、執行環境參數等。而對於一個常量表達式而言,總是默認為進行溢出檢查。

使用了unchecked操作符後,溢出的發生不會導致編譯錯誤。但這往往會出現一些不可預期的結果,所以使用unchecked操作符要小心。

下面的例子說明了checked和unchecked操作符的用法:

class Test
{
  static int x=1000000;
  static int y=1000000;
      static intF(){
      return checked(x*y); //編譯錯誤,拋出異常
  }
      static int G(){
      return unchecked(x*y); //返回值為-727379968
  }
      static int H(){
      return x*y;  //依賴於編譯時的默認情況
  }
}

由於編譯時沒有對任何表達式進行計算,因此不會產生編譯錯誤。當程序運行時,調用F方法會拋出一個OverFlowException異常,而調用G方法則返回-727379968(超出結果范圍的低32位)。H方法是否拋出異常則要看編譯環境的默認情況了,調用它的結果有可能與F相同,也有可能與G相同。而對於常量表達式則是另一種情況:

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;
  }
}

當計算F和H方法中的常量表達式時發生溢出,由於是在checked環境中,那麼在編譯時就報告錯誤。當計算G方法中的常量表達式時,也會發生溢出,但不會報告錯誤。

checked和unchecked操作符只影響置於其後括號之中運算的溢出檢查。它們不會影響作為表達式結果的被調用的方法成員。例如:

class Test
{
  static int F(int x,int y){
     return x*y;
  }
  static int G(){
  return checked(F(1000000,1000000));
  }
}

其中,G方法中的checked不會影響函數F方法中的x*y運算,因此,x*y運算在默認溢出檢查的上下文中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved