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
英文地址,請注明出處:http://en.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…