【C#多态】as 类型检测(原理分析) ---用于多态检测

2022/1/30 1:04:25

本文主要是介绍【C#多态】as 类型检测(原理分析) ---用于多态检测,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

as功能:

运算符类似于强制转换操作;但是,如果转换不可行,as会返回 null而不是引发异常。更严格地说,这种形式的表达式
相当于:expression is type ? (type)expression : (type)null  做类型检测判断,如果类型兼容则转换,否则返回null
只是as 只被计算一次。

使用规则:

1、as只能用于引用类型不能用于值类型,值类型不能继承所以无法做检测。
2、没有继承关系的引用类型之间无法转化,编辑器会直接报错。

例如:要求x所属的类与类A必须是子类和父类的关系,否则编译错误。如果x属于类A的子类B,x as A值也为true。

原理分析:
从corelr角度分析as用法
源代码:https://github.com/Potapy4/dotnet-coreclr/blob/master/src/vm/jitinterface.h

is/as 关键字是通过CLR中的 isinst 指令实现,而非反射。

isinst 在当下CoreCLR实现中,对于引用以及值类型,JIT会生成代码调用CoreCLR内部的FCall方法 JIT_IsInstanceOfClass_Portable\JIT_IsInstanceOfClass ,而对于接口类型的断定会调用JIT_IsInstanceOfInterface_Portable\JIT_IsInstanceOfInterface

InstanceOfClass 在java就是用于多态检测。所以我们可以指定as 就是java中的InstanceOfClass功能。

个人总结:原理是as用来检测多态的,多态是对行为抽象。而值类型没有行为 当然无法转化, 所以不能将as is用于值类型




这篇关于【C#多态】as 类型检测(原理分析) ---用于多态检测的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程