c#学习相关系列之as和is的相关用法

一、子类和父类的关系

    public class Program
    {
        static void Main(string[] args)
        {
            Animal animal = new Dog();
            // Dog dog = (Dog)new Animal(); 编译成功,运行报错
            Dog dog = (Dog)animal;

            Dog dog = new Dog();
            Animal animal = dog; //等价于Animal animal = new Dog();
        }
    }

    public class Dog:Animal
    { 
    
    }
    public class Animal
    { 
    
    }

上述代码中子类是Dog,父类为Animal,子类和父类的关系主要记住为一下三点:

1、子类可以直接转为父类

Animal animal = new Dog();

2、父类实例化后不能转为子类,强制转换后 能编译但是运行报错

Dog dog = (Dog)new Animal(); 编译成功,运行报错

3、子类可以转为父类后再转为其他子类

Animal animal = new Dog();
Dog dog = (Dog)animal;

二、 is和as用法和区别

        is用于检查对象是否与指定类型兼容,如果是,则返回true,否则返回false。is操作符不会抛出异常,因此它是一种安全的类型转换方式。

        as操作符用于将对象转换为指定类型,如果对象与指定类型兼容,则返回转换后的对象,否则返回null。与is操作符不同,as操作符不会抛出异常,因此它也是一种安全的类型转换方式。

因为只有子类可以转为父类,所以我们只能去判断父类是不是子类的实例化类型,只能去判断animal is dog,animal as dog,不能去判断子类是否是父类如 dog is animal ,dog as animal!!!

用法示例:

        static void Main(string[] args)
        {
            Animal animal1 = new Dog();
            if (animal1 as Dog!=null)
            {
                Console.WriteLine("animal1 is dog");
            }
            else
            {
                Console.WriteLine("animal1 is not dog");
            }
            Animal animal2 = new Animal();
            if (animal2 as Dog != null)
            {
                Console.WriteLine("animal2 is dog");
            }
            else
            {
                Console.WriteLine("animal2 is not dog");
            }
            var b1 = animal1 is Dog;
            var b2 = animal2 is Dog;
            Console.WriteLine(b1);
            Console.WriteLine(b2);
            Console.ReadKey();
        }
    }

    public class Dog:Animal
    { 
    
    }
    public class Animal
    { 
    
    }

通过将子类dog转为animal1,则此时父类animal1 是dog类型,由此可以看出父类可以是子类dog类型,也可以是父类animal类型,所以is 和as 类型转换关键字是对父类的用法!!


运行结果为:
c#学习相关系列之as和is的相关用法_第1张图片

你可能感兴趣的:(C#从入门到精通系列,c#,学习,开发语言)