C# 使用模式匹配以及 is 和 as 运算符安全地进行强制转换

embedded/2024/9/24 22:25:51/

C# 使用模式匹配以及 is 和 as 运算符安全地进行强制转换

  • is 运算符
  • as 运算符
  • 模式匹配
  • 使用场景
  • 拓展
    • 父类和子类的检查
    • 校验与对象类型

is 运算符

用于检查一个对象是否是特定类型。C# 7 引入了 is 运算符的模式匹配功能,可以在检查类型的同时进行类型转换

object obj = "Hello, world!";if (obj is string str)
{Console.WriteLine($"String length: {str.Length}");
}

is 运算符不仅检查 obj 是否是 string 类型,还将其转换为 str 变量,并在条件块中使用。这样可以避免不必要的显式转换,提高代码的安全性和简洁性。

as 运算符

运算符用于尝试将一个对象转换为特定类型。如果转换成功,则返回转换后的对象;如果转换失败,则返回 null

object obj = "Hello, world!";
string str = obj as string;if (str != null)
{Console.WriteLine($"String length: {str.Length}");
}
else
{Console.WriteLine("obj is not a string.");
}

这里 obj 被尝试转换为 string 类型,并赋值给 str。随后可以通过 str != null 来检查转换是否成功,从而避免不安全的显式类型转换。

模式匹配

C# 7 引入了模式匹配特性,使得你可以在 switch 语句和 is 运算符中结合模式进行类型检查和转换

object obj = 42;switch (obj)
{case int i:Console.WriteLine($"Integer: {i}");break;case string s:Console.WriteLine($"String: {s}");break;default:Console.WriteLine("Unknown type.");break;
}

这里 switch 语句通过模式匹配直接检查 obj 的类型,并将其转换为对应的类型变量 i 或 s。这种方式不仅简化了类型检查的代码,还确保了类型转换的安全性。

使用场景

  • 类型检查:在处理未知类型的对象时,使用 is 或模式匹配可以进行类型检查并转换,避免了不安全的显式转换。
  • 多态性:在继承关系中,is 和 as 可以用于检查和转换对象为基类或子类,这可以在运行时决定对象的具体类型。
  • 代码简洁性:模式匹配可以结合 switch 语句或 is 来简化类型检查和转换的代码逻辑,使其更易读。

拓展

  • is 和 as 运算符在类型检查和转换时,会考虑对象的实际类型以及继承关系
class Animal {}
class Dog : Animal {}object obj = new Dog();if (obj is Animal animal) {Console.WriteLine("It's an Animal.");
}Animal animal = obj as Animal;if (animal != null) {Console.WriteLine("It's an Animal.");
}

obj 是 Dog 的实例,但 Dog 继承自 Animal,所以 is Animal 检查会成功,并将 obj 转换为 animal

父类和子类的检查

is 和 as 运算符都可以识别并转换父类和子类之间的关系。

  • 向上转换(Upcasting):将子类转换为父类是安全的,也可以直接使用 is 或 as 来实现。
  • 向下转换(Downcasting):如果需要将父类转换为子类,你需要确保类型匹配,否则转换会失败。
Animal animal = new Dog();
Dog dog = animal as Dog;if (dog != null) {Console.WriteLine("It's a Dog.");
}

在这里,我们将 animal 向下转换为 Dog。如果 animal 实际上不是 Dog 的实例,则转换会失败,dog 会是 null。

  • 继承链的完整性:is 和 as 会识别整个继承链。因此,你可以使用它们来检查父类、子类甚至兄弟类之间的关系。

校验与对象类型

is 和 as 在类型检查和转换时,并不一定要求目标类型是 object。
is 和 as 运算符在类型检查和转换时,也可以用于泛型类型。

class Box<T> {}object obj = new Box<int>();if (obj is Box<int> boxInt) {Console.WriteLine("It's a Box<int>.");
}
Box<string> boxString = new Box<string>();
object obj = boxString;Box<string> convertedBox = obj as Box<string>;if (convertedBox != null) {Console.WriteLine("Successfully converted to Box<string>.");
}

http://www.ppmy.cn/embedded/33313.html

相关文章

Dockerfile部署LNMP

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3. 任务需求 二、Linux系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写Dockerfile脚本 3. 准备nginx.conf配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证nginx 四、Mysql 1. 建立工作目录 2. …

Python数据分析案例43——Fama-French回归模型资产定价(三因子/五因子)

案例背景 最近看到要做三因子模型的同学还挺多的&#xff0c;就是所谓的Fama-French回归模型&#xff0c;也就是CAMP资本资产定价模型的升级版&#xff0c;然后后面还升级为了五因子模型。 看起来眼花缭乱&#xff0c;其实抛开金融资产定价的背景&#xff0c;从机器学习角度来…

全球汽车电动制动用滚珠丝杠市场细分规模分析及预测2024

滚珠丝杠可用于汽车电动制动机构。汽车电动制动助力器产品主要由行程传感器、踏板模拟器、电机、控制器、双级减速机构、滚珠丝杠传动机构、壳体、制动总泵等组成。该机构采用双级减速齿轮和滚珠丝杠的传动方式。双级齿轮采用注塑齿轮和粉末冶金齿轮的复合传动设计&#xff0c;…

模型剪枝——Linear Combination Approximation of Feature for Channel Pruning

线性逼近剪枝代码实现见文末 论文地址:CVPR 2022 Open Access Repositoryhttps://openaccess.thecvf.com/content/CVPR2022W/ECV/html/Joo_Linear_Combination_Approximation_of_Feature_for_Channel_Pruning_CVPRW_2022_paper.html 1.概述 传统的剪枝技术主要集中在去除对…

计算机网络实验二:交换机的基本配置与操作

实验二:交换机的基本配置与操作 一、实验要求 (1)掌握windows网络参数的设置(TCP/IP协议的设置); (2)掌握交换机命令行各种操作模式的区别,以及模式之间的切换; (3)掌握交换机的全局的基本配置; (4)掌握交换机端口的常用配置参数; (5)查看交换机系统和…

【.Net Core/.Net8教程】(三)如何优雅地校验参数

FluentValidation是一个流行的开源验证库&#xff0c;用于在.NET应用程序中验证输入数据。 它有如下特点 语法简洁强大的验证功能支持多语言和本地化可重用性和模块化易于集成详细的错误消息扩展性高 借助FluentValidation&#xff0c;我们可以达到优雅地校验参数的目的。 环…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5&#xff1a;自然语言处理实践&#xff08;情感分类&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;掌握RNN、LSTM、GRU的原理。 2&#xff1a;学习用RNN、LSTM、GRU网络建立训练模型&#xff0c;并对模型进行评估。 3&#xff1a;学习用RNN、LSTM、GRU网络做…

mac通过termius查看Linux服务器的性能

mac上安装 linux系统 如果有 linux服务器账号密码&#xff0c;那么上一步可忽略&#xff1b; 比如&#xff1a;直接连接阿里云或腾讯云账号 1. 安装termius 链接: https://pan.baidu.com/s/1iYsZPZThPizxqtkLPT89-Q?pwdbw6j 提取码: bw6j 官网 Termius - SSH platform for …