readonly 關鍵字與 const 關鍵字不一樣。const 字段只能在該字段的聲明中初始化。readonly 字段能夠在聲明或構造函數中初始化。所以,根據所使用的構造函數,readonly 字段可能具備不一樣的值。另外,const 字段爲編譯時常數,而 readonly 字段可用於運行時常數函數
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:檢查對象是否與給定的類型兼容。
例如,下面的代碼能夠肯定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 關鍵字會致使參數經過引用來傳遞。 這與 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 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞迴調用方法時,在方法中對參數所作的任何更改都將反映在該變量中。
程序實例:
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 }