是否有替代' as'有价值类型?

时间:2016-01-13 11:17:08

标签: c# casting value-type

我完全了解为什么 as不能用于值类型。但是,我所知道的唯一替代品是:

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

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

但是,此代码执行两次类型检查,这会产生性能成本,同样的成本as来解决参考类型。

我的问题:对于值类型,是否有更好的性能机制/语法?

我能想到的唯一单一类型检查机制是try/catch,但这当然具有自己的性能成本,我尽量避免基于异常的编程。

1 个答案:

答案 0 :(得分: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更加固定,它还不确定。