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

简介: 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 类型转换关键字是对父类的用法!!

运行结果为:

相关文章
|
22天前
|
安全 C#
C# List基本用法
C# List基本用法
|
22天前
|
C#
C# Dev chartControl的用法
C# Dev chartControl的用法
|
2月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
2月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
2月前
|
C#
C#学习相关系列之yield和return的区别
C#学习相关系列之yield和return的区别
|
2月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
2月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
2月前
|
存储 C# 索引
C#学习相关系列之数据类型类的定义(一)
C#学习相关系列之数据类型类的定义(一)
|
2月前
|
C#
C#学习相关系列之自定义遍历器
C#学习相关系列之自定义遍历器
|
2月前
|
C# 索引
C#学习相关系列之abstract和virtual用法
C#学习相关系列之abstract和virtual用法