2011-06-19 34 views
10

可能重複:
casting vs using the 'as' keyword in the CLRC#不同的鑄造方法 - (T)VS OBJ OBJ爲T

我已經看到了C#鑄造的兩種不同的方式。

例如:

MyObj foo = (MyObj) bar; // this is what I see most of the times 
MyObj foo = bar as MyObj; // I do see this sometimes 
  • 那麼,有什麼根本區別?
  • 鑄造style 1style 2的專有名稱是什麼?
  • 我該如何決定何時使用什麼?
  • 是否有任何重大性能問題?
  • 還有什麼我應該知道的與這個話題有關?如果轉換是無效

非常感謝您就這個:)

回答

24

第一個(「直接」或「C風格」鑄)拋出異常。它也是對對象執行實際類型轉換的唯一方法。 (請注意,類型轉換是從鑄造不同,因爲鑄造只是更改可變的類型,而類型轉換給你*不同類型的對象。)

第二個(沒有特定的名稱,雖然可以稱之爲「嘗試投射」,因爲它在VB.NET中被稱爲)評估爲null而不是投擲InvalidCastException。 (由於這種行爲,它只適用於參考類型)。

沒有比對方的主要性能問題。

只有當您使用期望您使用as您的結果可能無效。否則,請使用第一個。


順便說一句,MSDN might be helpful你的問題的部分:

as運營商就像是一個轉換操作。但是,如果轉換不可行,返回null而不是引發異常。考慮以下表達式:

expression as type 

除了僅對錶達式求值一次之外,它與以下表達式等價。

expression is type ? (type)expression : (type)null 

請注意,as運算符僅執行參考轉換和裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換,而應該使用轉換表達式來執行轉換。

+1

您沒有提及類型轉換運算符,它們不涉及轉換,但使用與轉換相同的語法。 –

+1

@梅林:好的,我會補充一點,謝謝。 :) @pst:感謝您的清理! – Mehrdad

+1

值得注意的是,'foo = bar作爲SomeType;'比'if(bar是SomeType){foo =(SomeType)bar; },因爲這個類型只被檢查一次。它比* try {foo =(SomeType)bar要快得多*; } catch(InvalidCastException){}'如果轉換失敗,因爲異常非常昂貴。 – Sven