is和as操作符

is操作符:检查对象是否与给定类型兼容。

说明:

1、如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true,否则返回false。

(1):表达式为空:返回false

//表达式为空
object oo = null;
bool isstudent3 = oo is student;

(2):表达式内容不为空,但强制转换类型时发生异常,返回false

oo = new object();
bool isstudent4 = oo is student;

(3):表达式为null时,并不会抛异常,因为没有正确的对象来做类型验证。

2、is操作符只考虑引用转换、装箱转换和取消装箱转换。下面的程序都会发生编译时错误(CTE):已知表达式将始终是 true 或始终是 false

int i=5;
if (i is decimal )
{
  //提示:给定表达式始终不是所提供的("decimal")类型
}
if (i is int)
{
  //给定表达式始终为所提供的("int")类型
}

3、不能重载is操作符。

4、"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式。

if ((delegate(int i) { return i; }) is testdelegate)
{
  //提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
}
if (((x) => { return x; }) is testdelegate)
{
  //提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
}

as 运算符:用于在兼容的引用类型之间执行转换
说明:

1、as操作符类似于强制转换,但又有区别,当对象为null时,不会抛异常而是会返回null。

object _object = null;
student _s = _object as student;

object as student其实相当于_object is student?(student)_object:null;

之所以这样说,我们可以从两者的IL代码中看出些结论:首先我们实例化个基类对象。

object o = new student();

然后分别执行:

(1) o is student,对应IL代码

.method private hidebysig static void Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小 18 (0x12)
  .maxstack 2
  .locals init ([0] object o,
  [1] bool isstudent2)
  IL_0000: nop
  IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
  IL_0006: stloc.0
  IL_0007: ldloc.0
  IL_0008: isinst JmTest.ConsoleApplication1.student
  IL_000d: ldnull
  IL_000e: cgt.un
  IL_0010: stloc.1
  IL_0011: ret
} // end of method Program::Main

(2) o as student,对应IL代码

.method private hidebysig static void Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小 15 (0xf)
  .maxstack 1
  .locals init ([0] object o,
  [1] class JmTest.ConsoleApplication1.student s2)
  IL_0000: nop
  IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
  IL_0006: stloc.0
  IL_0007: ldloc.0
  IL_0008: isinst JmTest.ConsoleApplication1.student
  IL_000d: stloc.1
  IL_000e: ret
} // end of method Program::Main

小结:两段IL代码都执行了isinst,它代表的意思是:测试对象引用是否为特定类的实例,在as操作符后面有一个stloc.1它代表的意思是:从计算堆栈的顶部弹出当前值到索引1处的局部变量列表中。从这两条IL语句的用途可以说明is和as操作符的部分关系。

2、as 运算符只执行引用转换和装箱转换,无法执行其他转换。下面的代码是错误的:

object _object = null;
student _s = _object as student;
//试图将一个对象转换成委托
testdelegate test = _s as testdelegate;

C# is和as操作符的更多相关文章

  1. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  2. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  3. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  4. oracle操作符

    Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5 比较操作符: 其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例 ...

  5. C# 本质论 第三章 操作符和控制流

    操作符通常分为3大类:一元操作符(正.负).二元操作符(加.减.乘.除.取余)和三元操作符( condition?consequence:alternative(consequence和alterna ...

  6. SQL优化技术分析-1:操作符优化

    1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL 性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有 ...

  7. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  8. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  9. SQL操作符

    Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...

  10. PHP中::、->、self、$this操作符的区别

    在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...

随机推荐

  1. jquery中prop()方法和attr()方法的区别

    最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...

  2. codeforces 192a

    link: http://codeforces.com/contest/330/problem/A brute force. /* ID: zypz4571 LANG: C++ TASK: 191a. ...

  3. poj1680 最短路判环

    题意:有多个银行可以换钱,每个银行可以将特定的两种钱相互兑换,并且有自己的汇率,现在问是否可以将自己的钱通过银行兑换增加. 其实比较水,主要就是知道最短路问题里的负环可以通过bellman-fold或 ...

  4. 黑马程序员——JAVA基础之简述多线程,两种创建多线程的方式

    ------- android培训.java培训.期待与您交流! ---------- 多线程: 进程和线程: 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者 ...

  5. 简单工厂模式(Simple Factory Pattern)

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  6. 常见半监督方法 (SSL) 代码总结

    经典以及最新的半监督方法 (SSL) 代码总结 最近因为做实验需要,收集了一些半监督方法的代码,列出了一个清单: 1. NIPS 2015 Semi-Supervised Learning with ...

  7. Syscall param open(filename) points to unaddressable byte(s)

    valgrind 调试出现如题所示的错误,原因是存取文件名的空间被释放了 源代码: cfg->snteam_cfg->snt.score.nd.wrd_dict_db_fn=cfg-> ...

  8. Unix 入门

    说明:转自以为大神的笔记. 首先,我们一起看看UNIX的目录,因为清楚了目录,才能对UNIX的框架有个大概的印象!当然这里讲的是系统正常运转所必须的,并且一定不能删除或者修改.  / 是系统的根目录: ...

  9. ABBYY PDF Transformer+ Pro支持全世界189种语言

    ABBYY PDF Transformer+ Pro版支持189种语言,包括我们人类的自然语言.人造语言以及正式语言.受支持的语言可能会因产品的版本不同而各异.本文具体列举了所有ABBYY PDF T ...

  10. 05-Java 集合类详解

    (1)Java集合-Collection A.集合可以理解为一个动态的对象数组,不同的是集合中的对象内容可以任意扩充 B.集合特点:性能高,容易扩展和修改 C.Collection的常用子类:List ...