2011-07-18 224 views
2

什麼(虛構的)之間的區別:回報(類型)實例或返回實例作爲類型

public Test GetTest() 
{ 
    Object obj = new Test(); 
    return (Test)obj; 
} 

而且

public Test GetTest() 
{ 
    Object obj = new Test(); 
    return obj as Test; 
} 

是不是正確的,第一種方法拋出如果obj ==異常空值?而第二個不?

回答

8

否;如果objnull,則兩種方法都會成功並返回null。區別在於如果obj不是Test的實例會發生什麼情況:第一種方法會拋出異常,而第二種方法會成功並返回null

換句話說:如果您知道您的對象是Test或者您不知道它是什麼,但是您想要一個例外(如果它不是Test),請使用第一種方法。如果您不知道自己的物體是什麼,請使用第二種方法,但如果它不是Test,您只想要一個和平的null。您還可以使用as進行類型檢查,如果你打算做一些特別的東西,如果類型檢查成功:的

var t = obj as Test; 
if (t != null) { 
    ... 
} 

代替:

if (obj is Test) { 
    var t = (Test)obj; 
    ... 
} 

這樣一來,你就不需要重複儘管第二種形式可能更清楚,並避免將t泄漏到範圍的其餘部分。

此外,請參閱@ il_guru的帖子,瞭解與as相關的一些其他注意事項。

+0

清除出口。感謝名單! –

2

也不會在投線上拋出異常。在C#中,如果new返回(因爲構造函數沒有拋出異常),那麼obj(很可能是模數情況下,你的內存被破壞了)保證是new ed類型的良好內存。這意味着,除其他事項外,obj將永遠不會被分配到null。因此,我更喜歡C風格演員(即(Test)obj),因爲它肯定有效,而且閱讀起來更清晰一些。

一般來說,演員陣容之間的區別在於,如果您的類型錯誤,C風格將拋出異常,而as只返回null。但是,再次,這些都不會發生在您提供的代碼中。

2

除了前面的回答中有關NULL的內容(顯式轉換爲null不會引發異常)之外,作爲轉換也有一些限制;如上所述MSDN

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

相關問題