四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2506|回复: 0
打印 上一主题 下一主题

C#中的is和as操作符

[复制链接]
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    跳转到指定楼层
    楼主
    发表于 2016-10-28 15:54:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在C#语言中进行类型转换的操作符is和as。is和as都是强制类型转换,但这两者有什么相同之处和不同之处呢?在使用is和as需要注意哪些事项?下面我们从简单的代码示例去探讨这个简单的问题。注:此博文只是本人学习过程中一些简要记录,新手可以看一下,高手略过。

    is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle。注意,is操作符永远不会抛出异常,请看以下示例:

    ClassA

    {

    ....

    }

    Object o=new Object();

    Boolean b1=(o is Object); //b1为true.

    Boolean b2=(o is ClassA) ; b2为false.

    如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。

    is 操作符通常像下面这样使用:

    if(obj is ClassA)

    {

        ClassA a=(ClassA) obj;

       ...

    }

    在这一段代码中,CLR实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型。如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响。这是因为CLR首先必须判断(obj)引用的对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(ClassA)。

    实际系统开发中,这是一个相当常用的编程模式,于是C#有了操作符as。

    as与is做差不多的事情,类型显式强制转换。
    as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是null。


    但as有其不同的地方,简化代码,同时提升性能。

    请看示例代码:

    Object obj=new Object();

    ClassA a= obj  as ClassA;

    if(a!=null)  //在if判断a是否为null

    {

    ...

    }

    在这一段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用;

    如果obj不兼容ClassA类型,as操作符会返回null。

    因此,as操作符使CLR只检验一次对象的类型。

    if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。

    所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。

    示例代码:

    Object obj=new Object(); //创建一个object对象.

    ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null.

    a.ToString();//访问a会抛出一个NullReferenceException异常。

    转载请保留原文地址:

    http://www.cnblogs.com/cgli/archive/2011/05/10/2041731.html
    http://www.divmy.com/
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-27 21:29 , Processed in 1.062500 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表