zoukankan      html  css  js  c++  java
  • 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用于转换!


  • 相关阅读:
    mongodb的安装
    express初体验
    vscode自定义快捷键
    项目开发前准备——清除默认样式
    手动开启和关闭mysql
    一步添加博客园看板娘
    js实现动态球球背景
    kendo grid 使用小结
    flask 与celery
    scrapy 调用js
  • 原文地址:https://www.cnblogs.com/noviceliu/p/1408447.html
Copyright © 2011-2022 走看看