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. 关于启动bash提示‘bash: export: `//这是新的': not a valid identifier’的解决办法

    学习linux以来将centos改的也不少了,也不知道这个问题是由于那个修改来的.最近改bash的操作环境配置文件,用到了~/.bashrc这个文件,发现里面被我修改过. 那是当年安装fcitx输入法 ...

  2. Go 面向对象编程应用

    #### Go 面向对象编程应用前面学习了很多的基础知识,这一节来实际写一个小案例:涉及到的知识: 1. 数组的基本使用2. 结构体3. 切片 4. 方法5. 循环6. 函数返回值(命名返回值,普通返 ...

  3. insert插入日期

    7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...

  4. java IO 文件复制代码模型

    package com.xjtu.demo; import java.io.*; public class FileCopy { public static void main(String[] ar ...

  5. Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization

    目录 Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization 1.Abstract 2.Intr ...

  6. python关于一些地址存储问题的知识

    在一个类型进行转换后不能马上进行操作.要先进行存储否则操作无效 原理一个类型转换后成为一个新的类型但是没有人接受它属于空值所以做任何操作都无效 li=[] print(li.append) 也是报错的 ...

  7. c++17 新特性

    编译环境说明:gcc 8.1 + eclipse +windows 10 eclipse cpp默认支持c++14,做c++17开发时,需要手动进行配置. 1.关键字 1)constexpr c++1 ...

  8. c#代码设计:子类和父类

    哭辽,事情是这样的 我想写个产品类用来放点相机参数,想类似这种的使用方式:(时间关系不改了,产品=Zoo,animals=相机) Zoo Zooxx= new Zoo (); Zoo.Animals ...

  9. bind方法源码

    'use strict'; module.exports = function bind(fn, thisArg) { return function wrap() { var args = new ...

  10. MySql数据存储格式Compact及计算MySql的B+Tree高度

    1.MySql的compact行记录格式 MySql从版本5.1以后默认使用的是compact行记录格式.可以通过执行以下命令查询到Row_format知悉InnoDB行记录格式类型. show ta ...