2016-01-13 52 views
-1

我完全瞭解爲什麼as不能用於值類型。不過,我知道的唯一的更換:有值類型的'as'替代嗎?

if (!(obj is MyValueType)) { // Type check #1 
    // Exception or whatnot 
} 

var myValueType = (MyValueType)obj; // Type check #2 

然而,這個代碼不類型檢查具有性能成本的兩倍,同樣的成本as來解決引用類型。

我的問題:值類型是否有更好的高性能機制/語法?

我能想到的唯一的單一類型檢查機制是try/catch,但這當然會有其自身的性能成本,並且我儘量避免基於異常的編程。

+1

不,它不是.. –

+1

'此代碼執行兩次類型檢查,其性能成本,'爲什麼不省略第一次檢查,並讓它在類型不正確時拋出'InvalidCastException'? – 2016-01-13 11:20:18

+0

@Kilanny作者不想使用try catch基於異常的編程。 –

回答

5

可以使用:

var maybeValueType = obj as MyValueType?; 
if (maybeValueType != null) 
{ 
    // Use maybeValueType.Value 
} 

然而,這performs worse than is + casting - 或者至少已經過去。

這有可能是C#7將解決這個問題:

if (obj is MyValueType value) 
{ 
    // Use value here 
} 

...但很明顯,直到C#7,更牽制,這不是一定的。

+0

懷疑如此。謝謝喬恩!只要SO讓我接受就會接受。 – tsemer