zoukankan      html  css  js  c++  java
  • 类型转换

    类型转换

    1.       CLR中,我们经常会使用到类型的转换,然而在转换的过程中,我们往往会忽视类型转换中所带给我们的危险  即转换安全问题。它即影响了软件的性能,也影响了应用程序的健壮性和不稳定性。

    通过这个小程序来说明问题吧:

    class Program

        {

            static void Main(string[] args)

            {

                Dog dog = new Dog();

                WangWang(dog);

                //DataTime也是Object 的派生类

                DateTime time = new DateTime();

              

                    WangWang(time);

              

            }

            //狗叫

            private static void WangWang(Object o)

            {

                //编译的过程中,CLR会获知这个o的类型  所以会编译通过

               

                Animal animal = (Animal)o;

            }

        }

        /// <summary>

        /// 动物类

        /// </summary>

        class Animal

        {

     

        }

        /// <summary>

        /// Dog派生类

        /// </summary>

        class Dog : Animal

        {

     

    }

    我写了一个Animal的基类,Dog类是Animal的派生类,在这里,我想让狗狗叫起来,给它一个WangWang的动作,在叫的同时,我把它传给了对象Object,这个是不会引发异常的,因为dog类是animal 的派生类,而且在编译的过程中CLR也是不会理会的,  不过在把DataTime类型传给Wangwang时候,则是会出现异常,指类型无法转换,这个是显然易见的。

    2.展开话题   C#就出现了is   as

    只有用到了 才感觉到它的好处。

               Object o = new Object();

                if (o is DateTime)

                {

                    WangWang(time)

                  }

    在上面的例子中, 我用到了is来给它判断类型是否兼容,返回判断的结果,是就返回ture 反之则是false。不过, 我发现,在判断的同时,这咯代码要判断两次,首先是判断类型是否兼容,其次又会检查其引用,这样很是麻烦

    as的用法减轻了程序的负担,

        Animal animal=o as time;

    If(animal!=null)

    {

        ………

    }

    As是通过检查类型是否兼容,如果兼容,返回一同一个对象的非空指针,如果不兼容则是返回null. as只检查了一次,is则是检查了两次(呵呵,终于明白了它们的区别)。

  • 相关阅读:
    $(function(){});和window.onload=function(){}的区别?
    DELETE和TRUNCATE的区别与联系
    SQL中count(*)和count(1)的区别
    泛型结构使用大全(泛型类、泛型接口)
    Stream流说明
    直接与非直接缓冲区
    Unix系统的五种I/O模型
    git使用方法
    linux下的系统调用函数到内核函数的追踪
    linux awk用法(主要为命令行)
  • 原文地址:https://www.cnblogs.com/renjie/p/1409034.html
Copyright © 2011-2022 走看看