2010-04-12 45 views
4

我遇到過這麼多次,感到困惑。Casting - 在C#中,「(myObject)something」和「something asObject」有什麼區別?

Cat c = new Cat("Fluffy"); 
return (Animal)c; 

Cat c = new Cat("Fluffy"); 
return c as Animal; 

什麼是對於這兩個語法存在的原因是什麼?

+2

嘗試而不是搜索。 http://stackoverflow.com/questions/2483/casting-newtype-vs-object-as-newtype http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator http:///stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr – 2010-04-12 13:32:06

+1

嗯我沒有檢查autocompleted下拉重複的問題,但它並不總是可靠的:/ – NibblyPig 2010-04-12 13:34:21

回答

14

as運營商是一個安全的演員。如果類型不兼容,as將返回null

另一方面,如果類型不是分配兼容的,則顯式轉換(Animal)c將拋出InvalidCastException

另外值得一提的是,as僅適用於繼承關係,而明確的強制轉換運算符將值類型工作...

decimal d = 4.0m; 
int i = (int)d; 

...與public static explicit operator的類型定義的任何其它explicit conversion operators 。這些將不適用於as

+0

+1可以也受益於'as'不能用於轉換爲值類型。 – 2010-04-12 13:30:05

+0

偉大的答案,尤其是像顯式/隱式投射的鏈接,知道有價值的信息。 – NibblyPig 2010-04-12 13:40:44

5

http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88420.aspx

「使用as運營商在C#中的三個重要方面鑄造的區別:

1)返回null,當你試圖轉換的變量不是請求類型或它的繼承鏈,而不是拋出異常。

2)它只能應用於引用類型變量轉換爲引用類型。

3)使用作爲不會perfor m用戶定義的轉換,如隱式或顯式轉換運算符,這些轉換語法將執行這些操作。

實際上在IL中定義了兩個完全不同的操作,它們處理這兩個關鍵字(castclass和isinst指令) - 它不僅僅是C#編寫的用於獲得這種不同行爲的「語法糖」。與鑄造相比,as的運算符在v1.0和v1.1版本中似乎稍微快了一點(即使在沒有無效的演員陣容的情況下,由於例外情況,演員隊伍的演員表現會嚴重降低)。「

0

演職員表語法,return (Animal)c;將拋出一個InvalidCastException如果對象不能轉換到類型Animal,這是很好的,如果你知道它是一種動物,如果不是的話,出了一些非常錯誤的。

return c as Animal;語法將返回null如果您想避免捕捉異常,這很方便:

Cat c = GetAnimal("Fluffy"); 
if (c == null) 
{ 
    AddAnimal("Fluffy"); 
} 
相關問題