is和as操作符的使用

类型安全是CLR中非常重要的一个特性,由于在.NET中所有的类型继承自System.Object,而Object对象又有GetType(),并且这个方法是非虚方法,我们是不能重写的。这样就充分的保证了对象的类型安全,也就能轻而易举的获取对象的精确类型,讨论isas关键字的使用,首先要深刻的理解.NET的类型转换,isas关键字的作用就是方便我们进行类型转换!

类型转换

将某一个类型转换成其他的类型是我们经常要做的事情,类型转换总的概括起来可以非常两种,就是隐式转换和显示转换。

l         隐式转换:将某一个对象转换成它的基类型,这种转换在C#中被认为是安全,所以不需要任何特殊的操作。称为隐式转换。

l         显示转换:相反,在将任何对象转换成它的派生类型时,C#要求使用特殊的语法,进行显示的转换,因为这种转换可能伴随有错误发生。

下面通过代码的形式讲解上面的两个概念,尽管有些过于简单了。

   

//Student类型隐含的继承自System.Object类型

    public class Student

    {

        //.........

    }

 

    //显示转换,因为需要将子类的实例转换成它的父类

    public class Teacher:Student

    {

        //.........

    }

    public class Program

    {

        static void Main(string[] args)

        {

            //隐式转换,因为new运算符返回的是Teacher类型的对象,

            //并且StudentTeacher的子类!

            Student student = new Teacher();

            //这样就存在潜在的风险!

            Teacher teacher = (Teacher)student;

        }

}

在运行时,CLR会检查操作,以确保会将对象总是转换成它的实际类型,获取它的基类型。这正是.NET框架中的类型安全,也是.NET框架中非常重要的一部分,也是我们日常编程中需要经常使用的。

isas操作符的使用

C#提供了isas操作符进行类型转换,他们有个共同的特点:就是永远不会抛出异常!

l         is:检查对象和给定的类型是否兼容,如果不兼容或者引用的对象为空,就返回false,如果类型兼容就返回true

l         as:也是检查对象和给定的类型是否兼容,和is不相同的是它在转换失败时,返回的是null!后面的代码中大家可以体会到,as的性能要比is操作符稍好一些!

下面还是通过代码的形式讲解上面的两个概念。

      Teacher teacher = new Teacher();

      //b1true

      System.Boolean b1 = (teacher is Student);

      //b2false

      Student student = new Student();

  System.Boolean b2 = (student is Teacher);

 

下面是is操作符的典型用法,

 

       //判断student能够转换成Teacher类型的对象

       if (student is Teacher)

       {

              Teacher teacher = (Teacher)student;

              //能够进行转换,也就可以在if语句内部使用teacher

              teacher.ToString();

   }

在上面的代码中大家可以看到,要想使用转后的实例,CLR实际上进行了两次检查操作!is操作符首先检查student所引用的对象是否和Teacher兼容,如果兼容,在if语句内部,CLR在进行转换时又会检查student是否是一个Teacher引用。

下面是as操作符的典型使用方法,大家可以看到,as操作符提供了更好的性能!

      //CLR检查student所引用的对象是否和Teacher兼容!

      Teacher teacher = student as Teacher;

      if (teacher != null)

       {

          //如果转换后的对象不为空,则表示转换成功

           //if语句内部使用teacher

           teacher.ToString();

}

注意在as操作符的转换中CLR只检查了一次,而is则检查了两次,性能获得了少许的提高!使用as操作符一定要进行非空类型检查,否则会抛出System.NullReferenceException异常!

千言万语归结为一句话,is用于判断,as用于转换!


转载于:https://www.cnblogs.com/noviceliu/archive/2009/03/11/1408447.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值