为了账号安全,请及时绑定邮箱和手机立即绑定

C#as强制转换与经典强制转换

C#as强制转换与经典强制转换

C#
月关宝盒 2019-12-16 10:24:28
C#as强制转换与经典强制转换我最近了解了一种不同的投射方式。而不是使用SomeClass someObject = (SomeClass) obj;可以使用以下语法:SomeClass someObject = obj as SomeClass;如果obj不是SomeClass,则似乎返回null,而不是引发类强制转换异常。我看到如果强制转换失败并且我尝试访问someObject变量,则可能导致NullReferenceException。所以我想知道这种方法的原理是什么?为什么要使用这种转换方式而不是(旧的)转换方式-似乎只能将失败的“更深层”转换问题转移到代码中。
查看完整描述

4 回答

?
达令说

TA贡献1821条经验 获得超6个赞

使用“经典”方法,如果强制转换失败,则会引发异常。使用as方法,它将导致null,可以对其进行检查,并避免引发异常。

另外,只能将“ as”与引用类型一起使用,因此,如果将类型转换为值类型,则仍必须使用“经典”方法。

注意:

as方法只能用于可以分配null值的类型。这种用法仅表示引用类型,但是当.NET 2.0出现时,它引入了可为空的值类型的概念。由于可以为这些类型分配一个null值,因此可以与as运算符一起使用。


查看完整回答
反对 回复 2019-12-16
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

空比较MUCH快于抛出和捕获异常。异常会产生大量开销-必须组装堆栈跟踪等。

异常应该代表一个意想不到的状态,通常不代表这种情况(这是as工作得更好的时候)。


查看完整回答
反对 回复 2019-12-16
?
开心每一天1111

TA贡献1836条经验 获得超12个赞

在某些情况下,处理null异常要容易一些。特别地,合并运算符非常方便:


SomeClass someObject = (obj as SomeClass) ?? new SomeClass();

它还根据对象的类型简化了代码所在的位置(不使用多态性和):


ClassA a;

ClassB b;

if ((a = obj as ClassA) != null)

{

    // use a

}

else if ((b = obj as ClassB) != null)

{

    // use b

}

如MSDN页面上所指定,as运算符等效于:


expression is type ? (type)expression : (type)null

这样可以完全避免使用异常,而希望使用更快的类型测试,但也将它的使用限制为支持的null类型(引用类型和Nullable<T>)。


查看完整回答
反对 回复 2019-12-16
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

as经营者是一对夫妇的情况下有用。

  1. 当您只需要知道某个对象是特定类型,而无需专门对该类型的成员进行操作时

  2. 当您想避免出现异常而改为明确处理时 null

  3. 您想知道对象之间是否存在CLR转换,而不仅仅是一些用户定义的转换。

第三点很微妙但很重要。在强制转换操作符将成功执行的强制转换与强制转换操作符将成功执行的强制转换之间没有1-1映射as。该as操作被严格限制在CLR转换并不会考虑用户定义的转换(转换算符会)。

具体来说,as操作员仅允许以下操作(来自C#语言规范的7.9.11节)

  • 根据E的类型,存在标识(§6.1.1),隐式引用(§6.1.6),装箱(§6.1.7),显式引用(§6.2.4)或拆箱(§6.2.5)转换。到T。

  • E或T的类型是开放类型。

  • E是空文字。


查看完整回答
反对 回复 2019-12-16
  • 4 回答
  • 0 关注
  • 646 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信