2012-02-09 48 views
3

我一直在閱讀SharePoint 2010的工作,我注意到,我從書籍到教學視頻中遇到的很多代碼示例都以我從未知道存在於C#中的方式投射SharePoint對象(並且認爲它是VB獨佔的) :使用「As」投射而不是(<T>)?

SPWeb web = properties.Feature.Parent as SPWeb;

我習慣了鑄造這種方式(SPWeb)properties.Feature.Parent(VB外),如果有任何特別的原因,大多數作品在SharePoint上我遇到使用VB式的鑄造符號只是好奇。

+0

這個問題確實與Sharepoint無關,你可能想重新標記。我添加了C#標籤。 – driis 2012-02-09 21:34:17

+0

謝謝,這是我見過的唯一一個彈出窗口,所以我認爲這只是SharePoint的最佳實踐。 – EHorodyski 2012-02-09 21:37:51

+1

http:// stackoverflow。com/questions/496096/cast-vs-using-the-as-keyword-in-the-clr :) – 2012-02-09 21:44:41

回答

6

as在C#中被稱爲安全演員操作符。那和普通演員之間有語義上的區別。如果類型不能被轉換,安全轉換不會拋出異常;它將返回null。如果無法投射類型,則普通投擲投擲InvalidCastException

換句話說,這個代碼分配null如果父如果不是類型的SPWeb:

SPWeb web = properties.Feature.Parent as SPWeb; 

而其他版本拋出如果父是不是正確的類型:

SPWeb web = (SPWeb)properties.Feature.Parent; 

as如果您不確定是否可以將某個對象轉換爲所需的類型,則操作符非常有用 - 在這種情況下,通常使用as,然後檢查是否爲空。 as只適用於引用類型,因爲值類型不能爲空。

這也在this longer article on MSDN中解釋。

順便說一下,VB中的等效運算符是TryCast(與DirectCast相比)。

+0

謝謝,這似乎是應該在警告標籤上的那些隱晦之一! – EHorodyski 2012-02-09 21:39:02

+0

重要的是要注意'as'只是語法糖。 – Zenexer 2012-02-09 21:41:02

1

使用關鍵字設置變量網絡爲null如果父類型的SPWeb的不是。

由於在父類不是SPWeb類型的情況下,顯式強制轉換會引發異常。

1

「as」比(cast)更安全,因爲它會返回給定類型的值或爲null。 你會發現下面這行會(或者應該)測試null。

1

如果轉換失敗賦值給變量變成零反對拋出異常「InvalidCastException的」

2
obj as T 

obj is T ? (T)obj : null 

語法糖。因此,這是一個「安全」的演員。然而,理論上它需要更長的時間。因此,除非特別要求對象不是預期類型,否則應該使用普通投射。更多的時候,你最好手動處理它:

if (!(obj is T)) 
{ 
    // Handle the case where obj is of an unexpected type. 
} 

T tobj = (T)obj;