这篇文章介绍了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
总结
- 对于引用类型的转换,应该考虑使用显式强转或as。两者的区别在于:一旦类型无法转换,使用显式强转会报错,而使用as会返回null。
- 为了避免显式强转或as所引发的报错,应该考虑使用is来判断类型间是否能转换。
- 使用as进行引用类型转换,不仅可以用is来判断类型间是否能转换,还可以通过判断as后的返回值是否为null,然后采取相应的操作。
- 对于基本类型的转换:使用Convert, Parse, TryParse等。
is用于判断类型是否一致,as和显式强转用于类型的转换。
到此这篇关于C#实现引用类型转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持得得之家。
本文标题为:C#使用is、as关键字以及显式强转实现引用类型转换


基础教程推荐
- C# 解析XML和反序列化的示例 2023-04-14
- Unity shader实现高斯模糊效果 2023-01-16
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#中 Json 序列化去掉null值的方法 2022-11-18
- C#中的Linq to JSON操作详解 2023-06-08
- 实例详解C#实现http不同方法的请求 2022-12-26