2016-01-13 26 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