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

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

我最近了解了一种不同的投射方式。而不是使用


SomeClass someObject = (SomeClass) obj;

可以使用以下语法:


SomeClass someObject = obj as SomeClass;

如果obj不是SomeClass,则似乎返回null,而不是引发类强制转换异常。


我看到如果强制转换失败并且我尝试访问someObject变量,则可能导致NullReferenceException。所以我想知道这种方法的原理是什么?为什么要使用这种转换方式而不是(旧的)转换方式-似乎只能将失败的“更深层”转换问题转移到代码中。


月关宝盒
浏览 705回答 4
4回答

达令说

使用“经典”方法,如果强制转换失败,则会引发异常。使用as方法,它将导致null,可以对其进行检查,并避免引发异常。另外,只能将“ as”与引用类型一起使用,因此,如果将类型转换为值类型,则仍必须使用“经典”方法。注意:该as方法只能用于可以分配null值的类型。这种用法仅表示引用类型,但是当.NET 2.0出现时,它引入了可为空的值类型的概念。由于可以为这些类型分配一个null值,因此可以与as运算符一起使用。

白衣染霜花

空比较MUCH快于抛出和捕获异常。异常会产生大量开销-必须组装堆栈跟踪等。异常应该代表一个意想不到的状态,通常不代表这种情况(这是as工作得更好的时候)。

开心每一天1111

在某些情况下,处理null异常要容易一些。特别地,合并运算符非常方便:SomeClass someObject = (obj as SomeClass) ?? new SomeClass();它还根据对象的类型简化了代码所在的位置(不使用多态性和):ClassA a;ClassB b;if ((a = obj as ClassA) != null){&nbsp; &nbsp; // use a}else if ((b = obj as ClassB) != null){&nbsp; &nbsp; // use b}如MSDN页面上所指定,as运算符等效于:expression is type ? (type)expression : (type)null这样可以完全避免使用异常,而希望使用更快的类型测试,但也将它的使用限制为支持的null类型(引用类型和Nullable<T>)。

胡说叔叔

该as经营者是一对夫妇的情况下有用。当您只需要知道某个对象是特定类型,而无需专门对该类型的成员进行操作时当您想避免出现异常而改为明确处理时&nbsp;null您想知道对象之间是否存在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是空文字。
打开App,查看更多内容
随时随地看视频慕课网APP