我遇到過這麼多次,感到困惑。Casting - 在C#中,「(myObject)something」和「something asObject」有什麼區別?
Cat c = new Cat("Fluffy");
return (Animal)c;
Cat c = new Cat("Fluffy");
return c as Animal;
什麼是對於這兩個語法存在的原因是什麼?
我遇到過這麼多次,感到困惑。Casting - 在C#中,「(myObject)something」和「something asObject」有什麼區別?
Cat c = new Cat("Fluffy");
return (Animal)c;
Cat c = new Cat("Fluffy");
return c as Animal;
什麼是對於這兩個語法存在的原因是什麼?
as
運營商是一個安全的演員。如果類型不兼容,as
將返回null
。
另一方面,如果類型不是分配兼容的,則顯式轉換(Animal)c
將拋出InvalidCastException
。
另外值得一提的是,as
僅適用於繼承關係,而明確的強制轉換運算符將值類型工作...
decimal d = 4.0m;
int i = (int)d;
...與public static explicit operator
的類型定義的任何其它explicit conversion operators 。這些將不適用於as
。
+1可以也受益於'as'不能用於轉換爲值類型。 – 2010-04-12 13:30:05
偉大的答案,尤其是像顯式/隱式投射的鏈接,知道有價值的信息。 – NibblyPig 2010-04-12 13:40:44
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版本中似乎稍微快了一點(即使在沒有無效的演員陣容的情況下,由於例外情況,演員隊伍的演員表現會嚴重降低)。「
演職員表語法,return (Animal)c;
將拋出一個InvalidCastException如果對象不能轉換到類型Animal
,這是很好的,如果你知道它是一種動物,如果不是的話,出了一些非常錯誤的。
的return c as Animal;
語法將返回null如果您想避免捕捉異常,這很方便:
Cat c = GetAnimal("Fluffy");
if (c == null)
{
AddAnimal("Fluffy");
}
有了這個:
return (Animal)c;
你被明確說c是一種動物,如果不是出了問題。
有了這個:
return c as Animal;
你說你是很肯定C是一種動物,但也許不是所有的時間。
它埃裏克利珀會談在自己的博客:
嘗試而不是搜索。 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
嗯我沒有檢查autocompleted下拉重複的問題,但它並不總是可靠的:/ – NibblyPig 2010-04-12 13:34:21