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