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. AOP-基本概念

    AOP(概念) 1,什么是AOP (1)面向切面(方面)编程 :利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. (2)通 ...

  2. 机器学习-softmax回归 python实现

    ---恢复内容开始--- Softmax Regression 可以看做是 LR 算法在多分类上的推广,即类标签 y 的取值大于或者等于 2. 假设数据样本集为:$\left \{ \left ( X ...

  3. l线程池抓取lianjia

    1. 线程池 的应用 from multiprocessing.dummy import Pool import requests from lxml import etree url="h ...

  4. SpringBoot Log4j 安全漏洞分析及解决方案

    一.序言 SpringBoot作为Java基础框架大行其道,前不久爆发出Log4j安全漏洞,大众更多关心Log4j的危害是多么严重,然而鲜有关心SpringBoot这一底层框架的安全性问题,换而言之, ...

  5. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  6. JS 基本类型的包装对象

    笔记整理自:廖雪峰老师的JS教程 目录 包装对象 不写new的作用 总结 注意 包装对象 JavaScript还提供了包装对象,熟悉Java的小伙伴肯定很清楚int和Integer这种暧昧关系. nu ...

  7. web项目获取全路径、端口、项目名等

    感谢大佬:https://blog.csdn.net/u010180031/article/details/52369537 request.getSchema(),返回的是当前连接使用的协议,一般应 ...

  8. JabRef

    # JabRef 下载 https://www.fosshub.com/JabRef.html # JabRef 安装 自己更改下目录直接安装接可以了 # 新建自己的库, 然后点击保存就可以了. # ...

  9. 6、架构--Nginx虚拟主机(基于多ip、端口、域名方式)、日志配置、Nginx模块(访问控制模块、状态监控模块、访问链接控制模块)

    笔记 1.晨考 2.昨日问题 3.今日内容 1.Nginx虚拟主机 - 基于多IP的方式 - 基于多端口的方式 - 基于多域名的方式 2.日志配置 Nginx有非常灵活的日志记录模式,每个级别的配置可 ...

  10. opencv笔记--stitching模块

    opencv 提供了全景图像拼接的所有实现,包括: 1)stitching 模块提供了图像拼接过程中所需要的基本元素,该模块主要依赖于 features2d 模块: 2)提供了 stitching_d ...