as(OpCodes.Castclass)功能:测试对象引用(O 类型)是否为特定类的实例。
相当于: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

引用ECMA-335, is运算符生成isinst对象模型IL指令(Partition III§4.6),它是基本指令集的一部分,而不是反射库的一部分(Partition IV§5.5)。
编辑:与反射库相比,is操作符非常高效。你可以通过反射以更慢的速度执行基本相同的测试:
typeof (T) .IsAssignableFrom (obj.GetType ())
编辑2:关于castclass和isinst指令的效率你是不正确的(你现在已经从文章中编辑掉了)。它们在任何实际的VM实现中都是高度优化的。唯一涉及到的真正的性能问题是强制类型抛出异常的可能性,这可以通过使用c#作为操作符和null(对于引用类型)的测试,或者使用is操作符后接强制类型(对于值类型)来避免。

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

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 类型检测(原理分析) ---用于多态检的更多相关文章

  1. Harris角点检测原理分析

    看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...

  2. 阿里系产品Xposed Hook检测机制原理分析

    阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...

  3. c/c++ 多态的实现原理分析

    多态的实现原理分析 当类里有一个函数被声明成虚函数后,创建这个类的对象的时候,就会自动加入一个__vfptr的指针, __vfptr维护虚函数列表.如果有三个虚函数,则__vfptr指向的是第一个虚函 ...

  4. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  5. Android平台APK分析工具包androguard的部署使用和原理分析

    原创文章,转载请注明出处,谢谢. Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool.dex2jar以及jdgui.今天突然主要到Google code上有个叫 ...

  6. AbstractQueuedSynchronizer的介绍和原理分析(转)

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  7. Java 线程池原理分析

    1.简介 线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销.在应用上,线程池可应用在后端相关服务中.比如 Web 服务器,数据库服务器等 ...

  8. AbstractQueuedSynchronizer 原理分析 - Condition 实现原理

    1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口.Condition声明了一组等待/通知的方法,这 ...

  9. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

随机推荐

  1. gin框架中设置信任代理IP并获取远程客户端IP

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { gin.SetMo ...

  2. 【webpack4.0】---dev.config.js基本配置(六)

    一.开发环境配置准备 1.创建dev.config.js文件 用来配置开发环境的代码 2.安装webpack-merge cnpm install webpack-merge -D 用来合并webpa ...

  3. 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?

    云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜? Kubernetes 可以为做些什么? 在学习一种新技能之前,囧囧建议不要上去先看各种牛叉的实现,我们需要先搞清楚这个技能是什么?学习了之后能为我 ...

  4. C++ STL:std::unorderd_map 物理结构详解

    拉链法的 unordered_map 和你想象中的不一样 根据数组+拉链法的描述,我们很快能想到下面这样的拉链法实现的哈希表,但真的是这样吗?一起看下源码里的实现是怎么样的. 深入STL源码 代码不会 ...

  5. flask学习1

    总结 Flask Web 框架 轻量 websocket 全双工通讯 socket TCP 通讯 MongoDB 数据库 文件型数据库 {} 没有限制 和 约束 Mui + HTML5 Plus 调用 ...

  6. Spring中NESTED和REQUIRED_NEW传播行为的区别

    简介 PROPAGATION_REQUIRED_NEW: 表示当前方法必须运行在它自己的事务中.一个新的事务将被启动.如果存在当前事务,在该方法执行期间,当前事务会被挂起.如果使用JTATransac ...

  7. CentOS 7中的系统语言包及UTF-8、en_US.UTF-8和zh_CN.UTF-8的区别

    UTF-8.en_US.UTF-8和zh_CN.UTF-8的区别 en_US.UTF-8.zh_CN.UTF-8叫做字符集,就是说'A'.'B'.'中'.'国'等对应的整数值,en_US.UTF-8只 ...

  8. Handler消息机制的写法

    使用Handler的步骤:         1.主线程中创建一个Handler         private Handler handler = new Handler(){             ...

  9. js图片预览代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Linux文件系统与日志分析的了解

    Linux文件系统与日志分析 1.inode和block概述 2.模拟inode耗尽实验 3.ext类型文件恢复 4.xfs类型文件恢复 5.日志文件 6.日志分析 1.文件:文件是存储在硬盘上的,硬 ...