2009-03-04 146 views
2

我最近開始使用JSON和ExtJs框架,並在示例中遇到以下代碼。實例化「AS」關鍵字

我們使用這個檢索來自前端的信息:

object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]); 

然後在例如他們做到以下幾點:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject; 

我從來沒有見過的「爲」關鍵字使用這樣的之前。這是另一種顯式裝箱作爲JavaScriptObject的updatedConfig變量的形式,還是有什麼我不明白這一點?

感謝

回答

3

這被稱爲安全演員。它試圖從一種類型投射到另一種類型,如果投射失敗,則返回null而不是投擲InvalidCastException

實際上有兩個單獨的IL指令來處理「as」鑄造和普通靜態鑄造之間的區別。下面的C#代碼包含這兩種類型的鑄件:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Object o = null; 

     String s0 = (String)o; 
     String s1 = o as String; 
    } 
} 

第一鑄造使用castclass IL指令和第二鑄造使用isinst指令。

有關更詳細的解釋,請參閱Casting vs using the 'as' keyword in the CLR

2

as keyword是投在C#中的對象更安全的方式。

SomeType a = obj as SomeType; 

表示如果obj是SomeType類型,obj將被轉換爲該類型。如果obj爲null或不是SomeType類型,則a將爲null。

+1

這也是更快地使用「爲」和檢查空比檢查與「是」的類型,然後做一個硬鑄鐵。在後一種情況下,類型將被檢查兩次。 – 2009-03-04 12:05:42

0

as關鍵字的另一個優點是,如果類型不能被轉換,那麼它將拋出編譯時異常,因爲(cast)直到運行時纔會中斷。

0

此外,重要的是要記住,「as」在參考中操作而不是在對象本身中操作。這就是爲什麼它可以返回null而不是拋出異常,因爲對象將保持不變。這就是爲什麼你只能在引用類型上做到這一點。通過使用as運算符可以調用而不是

因此,as運算符對於「繼承和繼承hiearchy」是有用的:如果您有一個Person類,您可以執行: Person p = new Person(); ojbect o = p作爲對象; p = o as Person; 但是在任何情況下,內存中的對象都不會以任何方式修改,只是對其的引用。

希望幫助