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.pswp.cn/news/914980.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重要发布丨MaxKB V2正式发布,助力用户快速构建企业级智能体

2025年7月18日,MaxKB V2版本正式发布。MaxKB是一个强大易用的企业级智能体平台,致力于解决企业AI落地所面临的技术门槛高、部署成本高、迭代周期长等问题,让企业用户落地AI更简单。 秉承“开箱即用,伴随成长”的设计理念&#xff…

大语言模型任务分解与汇总:从认知瓶颈到系统化解决方案

一、缘起:为什么大模型需要"分而治之" 1.1 从一个真实场景说起 设想这样一个场景:你要求GPT-4帮你完成一份包含市场调研、竞品分析、财务预测和战略规划的商业计划书。即使是最先进的大模型,面对这样的复杂任务也会"力不从心&…

Spring核心注解@RequestMapping详解

RequestMapping 是 Spring Framework 中一个核心注解,用于在 Spring MVC(或 Spring WebFlux)中将 HTTP 请求映射到特定的处理器(Controller 中的方法)或处理器类。它告诉 Spring 框架:当一个匹配特定条件的…

OSPF路由协议的协商过程

OSPF的知识点非常多,协议过程也是一个不大不小的知识点,今天就简单的说一下,OSPF是如何进行协商的。OSPF(Open Shortest Path First)协议是一种用于路由选择的动态链路状态协议,是大型网络普遍使用的动态路…

MySql:索引,结构

文章目录注意事项结构注意事项 主键字段在建表时,会自动创建主键索引添加唯一约束时,数据库实际上会添加唯一索引。 解释: 增:创建: create [unique] index 索引名 on 表名 (字段名……);-- 举例 :给tb…

ts学习2

JavaScript 中的每个值都有一组行为,您可以通过运行不同的操作来观察这些行为。这听起来很抽象,但作为一个简单的例子,考虑我们可能在名为 message 的变量上运行的一些操作。 // Accessing the property toLowerCase // on message and then…

k8s环境使用Operator部署Seaweedfs集群(下)

作者:闫乾苓 文章目录4.4.3 部署seaweedfs集群4.4.4 验证集群运行状态4.4.5 测试集群功能4.4.3 部署seaweedfs集群 集群Yaml示例 apiVersion: seaweed.seaweedfs.com/v1 kind: Seaweed metadata:name: seaweed1namespace: default spec:image: chrislusf/seaweedf…

【橘子分布式】gRPC(理论篇)

一、简介 我们在前面学习了thrift rpc的知识,我们从其中接触到了IDL,编解码协议,服务的远程调用(调用远程服务就像在在本地调用一样)等各种概念。 其实我个人对thrift的使用并不多,我更多的是使用今天我们要提到的一个RPC框架称之…

OSPF高级特性之GR

一、概述OSPF GR(Graceful Restart),在路由器发生故障或管理员干预的情况下重启了OSPF进程时,重新构建控制平面时,转发平面不受影响,仍可以正常转发数据。在我们OSPF网络环境当中,假设路由器为框式路由器,通常框式路由器有多个主控板,当主主控板发生故障时会切换到备主控板上。…

iOS 构建配置与 AdHoc 打包说明

iOS 构建配置与 AdHoc 打包说明 1. 背景 在 iOS 项目中,通常需要支持 多个环境的构建和分发,比如: 开发环境 (Debug) → 本地调试内测环境 (AdHoc) → 提供 QA / 产品经理测试预发布环境 (AdHoc_Release) → 和正式版配置一致,但通…

【52】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码

文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示,功…

笔试——Day12

文章目录第一题题目思路代码第二题题目:思路代码第三题题目:思路代码第一题 题目 删除公共字符 思路 模拟: 遇到需要删除的字符,则不添加到结果中 代码 第二题 题目: 两个链表的第一个公共结点 思路 模拟&#x…

SpringMVC @ResponseBody注解详解

概要ResponseBody是 Spring MVC 中的一个重要注解,用于指示方法的返回值应该直接作为 HTTP 响应体返回,而不是解析为视图名称。基本功能ResponseBody主要用于将Java对象转换为HTTP响应体(通常是JSON或XML)绕过视图解析器直接返回数…

剑指offer——模拟:顺时针打印矩阵

模拟vector.size返回的是矩阵的行数,vector[0].size返回的是矩阵的列数先排除传入的矩阵是空矩阵先计算上下左右的边界只要边界不重合,就不停止输出,完成一个部分的打印,就将当前的一个边界回收不可以在for循环结束的时候一起判断…

electron-vite实践成品项目

羊驼的工具箱 项目地址 推荐使用该版本 并且使用yarn进行安装 node版本:v22.16.0 技术栈:electron vue3 vite pinia vuetify3 sequelize sqlite Q:为什么vue3要用 vue2的写法 A:其实是因为刚开始用vue3的写法感觉超级恶心 对属性的赋值和方法的管理可观性…

自学中医笔记(一)

我的中医自学笔记 Q&A 自学原因:最开始我也不太信中医,我室友也说中医太玄学了。由于我从小一直都很瘦,吃饭每次都吃得少,上大学那会儿171cm最多也才101斤,而且一年胃病要犯好几次,后来无意中收获了一篇…

3.1 WPF画折线图、直方图、饼状图

本文看了博客WPF编程&#xff0c;Live Charts使用说明&#xff08;2&#xff09;——使用_func<chartpoint, string> labelpoint-CSDN博客&#xff0c;这里作为笔记用。 1.前端代码 前端XAML文件代码如下&#xff1a; <Window x:Class"livechart1.MainWindow&…

如何通过ATS/HTTPS数据防篡改来加密视频?

文章目录前言一、什么是ATS/HTTPS数据防篡改&#xff1f;二、ATS/HTTPS数据防篡改的实现原理三、如何零代码实现ATS/HTTPS数据防篡改来加密视频总结前言 未经保护的视频流极易在传输途中遭遇窃听、拦截或恶意篡改&#xff0c;不仅损害内容价值&#xff0c;更可能引发严重的安全…

Python并发模型:多线程与多进程的优劣对比与实战应用

文章目录多线程基础概念多进程基础概念多线程的优劣势多进程的优劣势实战应用&#xff1a;网络爬虫实战应用&#xff1a;图像处理Python作为一门功能强大的编程语言&#xff0c;提供了多种并发模型&#xff0c;使得我们能够在同一时间执行多个任务&#xff0c;从而提高程序的执…

Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解

Spring Boot 整合 Nacos 教程&#xff08;3000字&#xff09; 一、Nacos 简介 Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台&#xff0c;致力于帮助开发者更轻松地构建云原生应用。它支持多种注册中心协议&#xff08;如 Dubbo、Spring Cloud、Kubernete…