C# 中类型转换与模式匹配核心概念

对 C# 中类型转换与模式匹配核心概念的详细解释及实例说明。


1. 向上类型转换 (Upcasting)

向上转换是指从子类引用创建一个基类引用的过程。

  • 特性 :它是隐式发生的,因为编译器可以确保转换总能成功(子类必定是父类的一种)。
  • 影响:向上转换仅仅影响引用,而不会影响被引用的对象本身。它会限制你只能访问基类中定义的成员。

实例:

csharp 复制代码
EBook myEBook = new EBook("EB001", "C# 指南", "作者A", "http://dl.com");
Book bookRef = myEBook; // 向上转换:隐式发生

Console.WriteLine(bookRef.Title); // 成功:Title 在 Book 中定义
// Console.WriteLine(bookRef.DownloadUrl); // 错误:在 Book 引用下无法访问子类特有属性

2. 向下类型转换 (Downcasting)

向下转换是指从基类引用创建一个子类引用的过程。

  • 特性 :必须使用显式转换符(如 (EBook)),因为编译器不能保证转换总是成功。
  • 风险 :如果被引用的对象在运行时并不是目标子类类型,会抛出 InvalidCastException 异常。

实例:

csharp 复制代码
Book genericBook = new EBook("EB002", "进阶 C#", "作者B", "http://dl2.com");
// 显式向下转换
EBook explicitEBook = (EBook)genericBook; 
Console.WriteLine(explicitEBook.DownloadUrl); // 转换成功后可访问子类成员

3. as 运算符

as 运算符用于在不确定对象类型时执行安全的向下转换。

  • 特性 :如果向下转换失败,它会返回 null,而不会抛出异常。
  • 语义:它代表"我不确定其类型,请尝试转换,并根据输出结果确定执行逻辑"。

实例:

csharp 复制代码
Book someBook = new Book("B01", "普通书", "作者C");
EBook ebook = someBook as EBook; // 尝试转换

if (ebook != null) 
{
    Console.WriteLine(ebook.DownloadUrl);
}
else 
{
    Console.WriteLine("转换失败,该对象不是电子书。"); // 实际执行此行
}

4. is 运算符与引入模式变量

is 运算符 用于检测变量是否满足特定的模式,其中最常用的是类型模式。

核心用法:
  • 类型检查:检查对象是否从某个特定类派生或实现了某个接口。
  • 引入模式变量 (C# 7+):在检查成功的同时,直接声明并初始化一个特定类型的变量,该变量可以"立即"在当前作用域内使用。

实例:

csharp 复制代码
object someObject = new EBook("EB003", "模式匹配", "作者D", "http://dl3.com");

// 使用 is 运算符检查类型并引入模式变量 'eb'
if (someObject is EBook eb) 
{
    // 变量 'eb' 在此语句块内可直接使用,且已完成类型转换
    Console.WriteLine($"发现电子书:{eb.Title},下载地址:{eb.DownloadUrl}");
}

总结对比

特性 向上转换 (Upcasting) 向下转换 (Downcasting) as 运算符 is 模式匹配
转换方向 子类 → 基类 基类 → 子类 基类 → 子类 基类 → 子类
转换性质 隐式、必定成功 显式、可能失败 显式、安全 检查 + 转换
失败后果 无(编译期保证) 抛出异常 返回 null 返回 false
建议场景 实现多态 确定类型时使用 不确定类型时使用 现代 C# 推荐做法
相关推荐
David猪大卫2 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
用户3721574261352 小时前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
fengci.3 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_6784 小时前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu5 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu7 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.7 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
公子小六7 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
瑞雪兆丰年兮8 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客8 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎