类型转换

类型转换

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则是检查了两次(呵呵,终于明白了它们的区别)。

原文地址:https://www.cnblogs.com/renjie/p/1409034.html