什麼(虛構的)之間的區別:回報(類型)實例或返回實例作爲類型
public Test GetTest()
{
Object obj = new Test();
return (Test)obj;
}
而且
public Test GetTest()
{
Object obj = new Test();
return obj as Test;
}
是不是正確的,第一種方法拋出如果obj ==異常空值?而第二個不?
什麼(虛構的)之間的區別:回報(類型)實例或返回實例作爲類型
public Test GetTest()
{
Object obj = new Test();
return (Test)obj;
}
而且
public Test GetTest()
{
Object obj = new Test();
return obj as Test;
}
是不是正確的,第一種方法拋出如果obj ==異常空值?而第二個不?
否;如果obj
爲null
,則兩種方法都會成功並返回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
相關的一些其他注意事項。
也不會在投線上拋出異常。在C#中,如果new
返回(因爲構造函數沒有拋出異常),那麼obj
(很可能是模數情況下,你的內存被破壞了)保證是new
ed類型的良好內存。這意味着,除其他事項外,obj
將永遠不會被分配到null
。因此,我更喜歡C風格演員(即(Test)obj
),因爲它肯定有效,而且閱讀起來更清晰一些。
一般來說,演員陣容之間的區別在於,如果您的類型錯誤,C風格將拋出異常,而as
只返回null
。但是,再次,這些都不會發生在您提供的代碼中。
除了前面的回答中有關NULL的內容(顯式轉換爲null不會引發異常)之外,作爲轉換也有一些限制;如上所述MSDN
請注意,as運算符僅執行參考轉換和 裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換等 ,應該使用轉換表達式執行 。
清除出口。感謝名單! –