cast - object to int c#




Casting:(NewType)與Object作為NewType (9)

他們會拋出不同的例外。
():NullReferenceException
如:InvalidCastException
這可能有助於調試。

“as”關鍵字嘗試轉換對象,如果轉換失敗,則以無提示方式返回null。 如果轉換失敗,()轉換運算符將立即拋出異常。

“只有在非特殊情況下,您才需要使用C#”as“作為關鍵字,如果您希望演員成功並且沒有準備好接收任何失敗的對象,則應該使用()轉換操作符,以便引發適當和有用的異常。“

對於代碼示例和進一步的解釋: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html : http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

可能重複:
投射vs在CLR中使用'as'關鍵字

這兩個演員之間究竟有什麼區別?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

通常情況下,他們都應該顯式轉換為指定的類型?


兩種方法之間的區別在於第一個((SomeClass)obj)可能會導致類型轉換器被調用。


如果源類型不能轉換為目標類型,前者將拋出異常。 後者將導致sc2為空引用,但也不例外。

[編輯]

我的原始答案肯定是最明顯的差異,但正如Eric Lippert 指出的那樣 ,它不是唯一的答案。 其他差異包括:

  • 您不能使用'as'操作符來轉換為不接受'null'作為值的類型
  • 您不能使用'as' 數字轉換為不同的表示形式(例如,float到int)。

最後,使用'as'和演員,你也會說'我不確定這是否會成功。“


如果轉換嘗試失敗,則括號轉換會引發異常。 如果轉換嘗試失敗,則“as”強制轉換返回null。


所有這些都適用於引用類型,值類型不能使用as關鍵字,因為它們不能為null。

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

演員的語法更快,但只有成功時,失敗速度要慢得多。

最佳做法是使用, as當你不知道類型時:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

但是,如果你確定someObjectSomeClass一個實例,那麼就使用cast。

在.Net 2或以上的泛型意味著你很少需要有一個非類型的引用類的實例,所以後者不太經常使用。



要擴展Rytmis的評論 ,您不能使用as關鍵字作為結構(值類型),因為它們沒有空值。


這就像Parse和TryParse的區別。 如果您期望可能會失敗,則使用TryParse,但是如果您有足夠的保證,則不會因使用Parse而失敗。


那麼'as'操作符“幫助”你將問題埋在更低的地方,因為當它提供了一個不兼容的實例時,它將返回null,也許你會將它傳遞給一個將它傳遞給另一個的方法等等,會得到一個NullReferenceException,這會讓你的調試更加困難。

不要濫用它。 在99%的情況下,直接操作的操作員更好。







.net