当前位置: 首页 > news >正文

C#引用转换核心原理:类型视角切换

🔍 C#引用转换核心原理:类型视角切换

引用类型由内存指针和类型标记组成(如图1)。引用转换不改变内存地址,仅改变编译器识别对象的“视角”:

B myVar1 = new B();       // 实际B类型对象 
A myVar2 = (A)myVar1;    // 转为A类型视角Console.WriteLine(myVar2.Field1); // ✅ 访问A类字段
Console.WriteLine(myVar2.Field2); //  ❌ 编译错误:B类字段不可见

引用类型内存结构
-图示:同一内存对象的两种类型视角*

隐式引用转换:自动安全升级

编译器自动完成的类型向上转换,包括:

1. 类继承链转换

B obj = new B();
A baseRef = obj;      // 自动转为基类A 

2. 接口实现转换

class MyList : IEnumerable {...}
IEnumerable iRef = new MyList(); // 自动转为接口 

3. 特殊类型转换

  • 所有类型→object
  • 派生接口←父接口
  • 数组协变(需满足元素为引用类型且存在隐式转换)
    隐式转换规则

️ 显式引用转换:谨慎降级操作
向下转换需强制类型声明,存在运行时风险:

A myVar1 = new A(); 
B myVar2 = (B)myVar1;   // 编译通过但...
Console.WriteLine(myVar2.Field2); // 💥 运行时抛出InvalidCastException 

非法转换异常

✅ 三种安全显式转换场景

场景示例代码关键条件
转换冗余(可隐式完成)B b = new B(); A a = (A)b;基类转派生类无意义
源引用为nullA a1 = null; B b1 = (B)a1;空引用无内存风险
实际类型匹配A a2 = new B(); B b2 = (B)a2;对象本质是目标类型
// 场景3典型流程 
B realB = new B();      // 实际B类型对象
A asA = realB;          // ✅ 隐式向上转换 
B recoverB = (B)asA;    // ✅ 显式还原实际类型

安全类型还原

💡 实践建议

  1. 优先隐式转换:向上转换(类/接口继承链)无需显式声明
  2. 显式转换前验证类型:
    if (myVar is B) { B safeVar = (B)myVar; 
    }
    // 或使用as运算符 
    B safeVar = myVar as B;
    if (safeVar != null) {...}
    
  3. 警惕类型擦除:转换后派生类特有成员将不可访问
  4. 值类型不适用:此规则仅针对引用类型,值类型需装箱/拆箱

关键总结:引用转换本质是编译器的类型透视镜,内存数据不变,变的只是访问权限。显式向下转换如同“盲拆包裹”,必须确认内容物真实类型!

http://www.dtcms.com/a/286162.html

相关文章:

  • 弧焊机器人智能节气装置
  • Android 开机流程中的图片与动画解析
  • leetcode:冗余连接 II[并查集检查环][节点入度]
  • Android 之 audiotrack
  • 协作机器人操作与编程-PE系统示教编程和脚本讲解(直播回放)
  • 多模态大模型重构人机交互,全感官时代已来
  • PPIO × Lemon AI:一键解锁全流程自动化开发能力
  • Rust交叉编译自动化实战
  • 服务器内存满了怎么清理缓存?
  • 【DPDK】高性能网络测试工具Testpmd使用指南
  • ARINC818航空总线机载视频处理系统设计
  • 第一篇htmlcss详细讲解
  • 铁路基础设施无人机巡检技术及管理平台
  • 基于R、Python的Copula变量相关性分析及AI大模型应用
  • Altera Quartus:BAT批处理实现一键sof文件转换为jic文件
  • Altera Quartus:编译完成后自动生成pof文件
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十二课——图像直方图统计的FPGA实现
  • 28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast
  • 开源Docmost知识库管理工具
  • Win11安装Docker,并使用Docker安装RabbitMQ
  • 智能算法优化储能系统充放电策略
  • 基于R语言piecewiseSEM结构方程模型在生态环境领域实践技术应用
  • 指定阿里镜像原理
  • 创建线程的方式有哪些?相比继承Thread类,实现Runable接口的好处是什么?
  • 线上 CPU 过高怎么排查
  • mac系统安装、启动Jenkins,创建pytest接口自动化任务
  • 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
  • 力扣面试150(33/150)
  • 事务处理与AOP(web后端笔记第四期)
  • linux 脚本解释