const和readonly、as和is、out和ref

readonly

readonly 關鍵字與 const 關鍵字不一樣。const 字段只能在該字段的聲明中初始化。readonly 字段能夠在聲明或構造函數中初始化。所以,根據所使用的構造函數,readonly 字段可能具備不一樣的值。另外,const 字段爲編譯時常數,而 readonly 字段可用於運行時常數函數

as

 as:用於檢查在兼容的引用類型之間執行某些類型的轉換。   spa

       Employee myEmployee = myObject as Employee;   code

       if (myEmployee != null) { }    對象

       在這段代碼中,CLR覈實myObject是否兼容於Employee類型;若是是,as會返回對同一個對象的一個非null 的引用。若是myObject不兼容於Employee類型,as運算符會返回null。blog

       as運算符的工做方式與強制類型轉換同樣,只是它永遠不會拋出一個異常。相反,若是對象不能轉換,結果就是null。因此,正確的作法是檢查最終生成的一引用是否爲null。若是企圖直接使用最終生成的引用,會拋出一個System.NullReferenceException異常。如下代碼對此進行了演示:io

         Object o = new Object();                   新建一個Object對象。編譯

         Employee e = o as Employee;           將o轉型爲一個Employeeclass

          e.ToString();                                       訪問e會拋出一個NullReferenceException異常變量

       as運算符只執行引用轉換和裝箱轉換。as運算符沒法執行其它轉換,若是用戶定義的轉換,這類轉換應使用強制轉換表達式來執行。兼容性

 Is

Is:檢查對象是否與給定的類型兼容

       例如,下面的代碼能夠肯定MyObject類型的一個實例,或者對象是否從MyObject派生的一個類型:     

        if(obj is MyObject){}     

        若是所提供的表達式非空,而且所提供的對象能夠強制轉換爲所提供的類型而不會致使引起異常,則 is 表達式的計算結果將是 true。若是已知表達式始終是true或始終是false,則is關鍵字將致使編譯時警告,可是一般在運行時才計算類型兼容性。    

        注意:is運行符不能重載,is運行符只考慮引用轉換、裝箱轉換和取消裝箱轉換。不考慮其它轉換,若是用戶定義轉換。在Is運算符的左側不容許使用匿名方法。lambda表達式屬於例外。

         Object myObject = new Object();      

         Boolean b1 = (myObject is Object);      true.     

         Boolean b2 = (myObject is Employee);    false.      

        若是對象引用是null,is運算符老是返回false,由於沒有可檢查其類型的對象。       

     

 is運算符一般像下面這樣使用:  

1 if (myObject is Employee)  
2      {
3           Employee myEmployee = (Employee)myObject;
4      }

Out

     out 關鍵字會致使參數經過引用來傳遞。 這與 ref 關鍵字相似,不一樣之處在於 ref 要求變量必須在傳遞以前進行初始化。 若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。

程序實例:

 1 class OutExample
 2 {
 3     static void Method(out int i)
 4     {
 5         i = 44;
 6     }
 7     static void Main()
 8     {
 9         int value;
10         Method(out value);
11         // value is now 44
12     }
13 }

    out 參數傳遞的變量沒必要在傳遞以前進行初始化,但須要調用方法以便在方法返回以前賦值,樣的 屬性不是變量,所以不能做爲 out 參數傳遞.

ref

 ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞迴調用方法時,在方法中對參數所作的任何更改都將反映在該變量中。

  1. 若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
  2. 傳遞到 ref 參數的參數必須最早初始化。這與 out 不一樣,out 的參數在傳遞以前不須要顯式初始化。
  3. 屬性不是變量,所以不能做爲 ref 參數傳遞。
  4. 儘管 ref 和 out 在運行時的處理方式不一樣,但它們在編譯時的處理方式是相同的。所以,若是一個方法採用 ref 參數,而另外一個方法採用 out 參數,則沒法重載這兩個方法。例如,從編譯的角度來看,如下代碼中的兩個方法是徹底相同的。若是嘗試這麼作,將致使不能編譯該代碼。
  5.  若是一個方法採用 ref 或 out 參數,而另外一個方法不採用這兩類參數,則能夠進行重載。

程序實例:

 1  class RefExample
 2 {
 3     static void Method(ref int i)
 4     {
 5         i = 44;
 6     }
 7     static void Main()
 8     {
 9         int val = 0;
10 
11         Method(ref val);
12 
13         // val is now 44
14     }
15 }
相關文章
相關標籤/搜索