'as' 是否可以用值类型代替?
Is there a replacement for 'as' with value types?
我完全知道为什么 as
不能用于值类型。但是,我知道的唯一替代方法是:
if (!(obj is MyValueType)) { // Type check #1
// Exception or whatnot
}
var myValueType = (MyValueType)obj; // Type check #2
但是,此代码会执行两次类型检查,这会产生性能成本,相同的成本 as
用于解决引用类型。
我的问题:值类型是否有更好的性能机制/语法?
我唯一能想到的单一类型检查机制是try/catch
,但它当然有其自身的性能成本,我尽量避免基于异常的编程。
您可以使用:
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 更加固定之前,这还不确定。
我完全知道为什么 as
不能用于值类型。但是,我知道的唯一替代方法是:
if (!(obj is MyValueType)) { // Type check #1
// Exception or whatnot
}
var myValueType = (MyValueType)obj; // Type check #2
但是,此代码会执行两次类型检查,这会产生性能成本,相同的成本 as
用于解决引用类型。
我的问题:值类型是否有更好的性能机制/语法?
我唯一能想到的单一类型检查机制是try/catch
,但它当然有其自身的性能成本,我尽量避免基于异常的编程。
您可以使用:
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 更加固定之前,这还不确定。