软件编程
位置:首页>> 软件编程>> C#编程>> C#使用is、as关键字以及显式强转实现引用类型转换

C#使用is、as关键字以及显式强转实现引用类型转换

作者:Darren?Ji  发布时间:2023-01-29 16:15:27 

标签:C#,is,as,关键字,显式,强转,引用,类型,转换

在C#中,当引用类型需要转换的时候,经常会用到关键字is、as以及显式强转。本篇来体验这三者的用法。

先来梳理.NET引用类型转换的"约定俗成",或者叫"惯例":

  • 子类可以隐式转换为父类/基类,也就是"里氏替换原则"所说的:子类必须能够替换其父类/基类。

  • 父类/基类转换为子类时,必须进行显式类型强转。

子类转换成父类

class Program
   {
       static void Main(string[] args)
       {
           Animal animal = new Dog(){Name = "Dog",Age = 1};
           Console.WriteLine(animal.Name);
           Console.ReadKey();
       }
   }

public class Animal
   {
       public string Name { get; set; }
   }

public class Dog : Animal
   {
       public int Age { get; set; }
   }

输出结果:Dog   

以上,体验了子类转换成父类,从中可以看出:子类Dog确实能替换父类Animal,换句话说,子类就是父类,子类的实例可以赋值给父类的变量,不需要as,不需要强转,一切都是隐式发生,很好地体现了"里氏替换原则"。

父类转换为子类,父类变量通过子类赋值而创建

父类as成子类:

Animal animal = new Dog(){Name = "Dog",Age = 1};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

输出结果:Dog 1

父类显式强转成子类

Animal animal = new Dog(){Name = "Dog",Age = 1};
Dog dog = (Dog)animal;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

输出结果:Dog 1   

以上,不管是使用as还是显式强转,父类都可以转换成子类,但是有前提的:把子类实例赋值给父类变量。  

父类转换为子类,父类变量通过自身构造函数而创建

父类as成子类失败:

Animal animal = new Animal(){Name = "Sheep"};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

输出结果:报"NullReferenceException"错

可见,当父类变量通过自身构造函数而创建时,无法将父类转换成子类。

(1)为了避免as的时候报"NullReferenceException"错,引入关键is做类型判断:

Animal animal = new Animal(){Name = "Sheep"};
if (animal is Dog)
{
   Dog dog = animal as Dog;
   Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
   Console.WriteLine("animal不能转换为Dog");
}
Console.ReadKey();

输出结果:animal不能转换为Dog

(2)用as做类型转换的时候,如果转换失败,返回null。根据这点,也可以通过判断as转换后的返回值是否为null,来避免报错:

Animal animal = new Animal(){Name = "Sheep"};
Dog dog = animal as Dog;
if (dog != null)
{
   Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
   Console.WriteLine("animal不能转换为Dog");
}
Console.ReadKey();

输出结果:animal不能转换为Dog   

父类显式强转成子类失败

Animal animal = new Animal(){Name = "Sheep"};
Dog dog = (Dog) animal;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

输出结果:报"InvalidCastException"错

可见,当父类变量通过自身构造函数而创建时,无法将父类转换成子类。

为了避免显示强转时报"InvalidCastException"错,引入关键字is做类型判断:

Animal animal = new Animal(){Name = "Sheep"};
if (animal is Dog)
{
   Dog dog = (Dog)animal;
   Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
   Console.WriteLine("animal不能转换为Dog");
}
Console.ReadKey();

输出结果:animal不能转换为Dog

来源:https://www.cnblogs.com/darrenji/p/3831421.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com