C# 類繼承中的私有字段都去了哪里?

最近在看 C++ 類繼承中的字段內存布局,我就很好奇 C# 中的繼承鏈那些 private 字段都哪里去了? 在內存中是如何布局的,畢竟在子類中是無法訪問的。

一:舉例說明

為了方便講述,先上一個例子:

internal?class?Program{static?void?Main(string[]?args){Chinese?chinese?=?new?Chinese();int?num?=?chinese.b;???//b?字段無法訪問,編譯報錯Console.WriteLine(num);}}public?class?Person{public?int?a?=?10;private?int?b?=?11;}public?class?Chinese?:?Person{public?int?c?=?12;}

根據 C# 的類繼承原則,上面的 chinese.b 寫法肯定是無法被編譯的,因為它屬于父類的 私有字段,既然無法被訪問,那這個 private b 到底去了哪里呢?要想找到答案,只能先從 chinese 實例處的匯編代碼看起,看看有沒有什么意外收獲。

二:查看 chinese 處匯編代碼

new chinese() 處下一個斷點,查看 Visual Stduio 2022 的反匯編窗口。

612957c27135d966f5af9394d57b5a20.png

接下來我稍微解讀下:

1. 根據 MT 類型 實例化 chinese

07FD6176??mov?????????ecx,87205C4h??
07FD617B??call????????CORINFO_HELP_NEWSFAST?(06E30C0h)

這里的 87205C4h 就是 Chinese 類型的 MT,然后通過 CLR 下的 CORINFO_HELP_NEWSFAST 處的方法進行實例化。

2. 使用 chinese 的構造函數進行類初始化

07FD6180??mov?????????dword?ptr?[ebp-40h],eax??
07FD6183??mov?????????ecx,dword?ptr?[ebp-40h]??
07FD6186??call????????CLRStub[MethodDescPrestub]@7e34871e07fd5d20?(07FD5D20h)
07FD618B??mov?????????eax,dword?ptr?[ebp-40h]

這里的 eax 是 CORINFO_HELP_NEWSFAST 初始化方法的返回值,可以在 ecx,dword ptr [ebp-40h] 處下一個斷點,觀察它的內存布局。

549251089ad9feb022867ff331d4260b.png

從布局圖看,此時的 chinese 只是一個清零的默認狀態,此時的 a,b,c 三個字段還沒有被賦值,那什么時候被賦值呢?這就是構造函數要做的事情了,也就是上面的 CLRStub[MethodDescPrestub]@7e34871e07fd5d20 (07FD5D20h) 指令,接下來在 07FD618B 處下一個斷點,再次觀察 0x02C9F528 處的內存地址,也就是 ebp-40 的位置,接下來我們繼續執行,截圖如下:

0b318d940b5b68101b5ca877e9a883ce.png

從圖中可以看到,當構造函數執行完之后,有三處內存地址(變紅)被賦值了,依次是 a,b,c,這時候是不是讓人眼前一亮。

3. 洞察真相

原來那個 b=11 并沒有丟,而是被 chinese 類給完全繼承下來的,而且布局規則是 父類 字段在前, 子類 字段在后的一種方式,有點意思,接下來的問題是如何把它提取出來?

三:如何提取 b 字段

如果是 C 語言,我們用 *(pointer+2) 就可以輕松提取,那用托管的 C# 如何去實現呢? 可以用復雜的 Marshal 包裝類,應該也可以變相的使用 Span 去搞定,這里我就不麻煩了,直接用非安全代碼下的 指針 去擺平,在 a 字段偏移 +4 的位置上提取, 參考代碼如下:

static?void?Main(string[]?args){unsafe{Chinese?chinese?=?new?Chinese();fixed?(int*?ch?=?&chinese.a){int?b?=?*(ch?+?1);Console.WriteLine($"b={b}");}}}}

哈哈,是不是挺有意思。

04505a04a714d3a1f6438b2ad96350b1.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286644.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大型分布式網站架構技術總結

本文是學習大型分布式網站架構的技術總結。對架構一個高性能,高可用,可伸縮,可擴展的分布式網站進行了概要性描述,并給出一個架構參考。一部分為讀書筆記,一部分是個人經驗總結。對大型分布式網站架構有很好的參考價值…

python 數據分析找到老外最喜歡的中國美食【完整代碼】

一、環境及依賴 語言:python3.8 抓取:selenium 代理:ipide **注:**想要完整代碼的在末尾,注意新手建議慢慢看完。在此提示一下本篇文章的編寫步驟:1.獲取數據、2.翻譯、3.數據清洗、4.切詞詞權重、5.詞云 …

Android之檢查跳轉的Activity是否存在

1、需求 android我們知道經常會跳各種設置頁面,比如設置默認瀏覽器頁面、設置添加快捷方式權限頁面,我們會根據機型進行適配,但是有時候如果找到也找個頁面不try catch操作程序會奔潰 2、檢查跳轉的Activity是否存在代碼實現 public static boolean hasActivity(Context co…

hihoCoder 1257 Snake Carpet(很簡單的構造方法)

2015 ACM / ICPC 北京現場賽 I 題 構造 注意一個小坑&#xff0c;每條蛇的輸出是要從頭到尾輸出的。 還要注意的是&#xff0c;不能開數組去模擬構造過程&#xff0c;然后輸出&#xff0c;那樣會TLE的。 #include <cstdio> #include <cstring> #include <cmath&…

西北師范大學地理與環境科學學院考研真題匯總(高等數學)持續更新。。。

西北師范大學地理與環境學科學院研究生入學考試的所有專業(地圖學與地理信息系統、自然地理學、人文地理學、環境科學、環境工程)的數學均為自主命題,復習參考教材為同濟大學第五版。

操作系統與多核處理器

這篇文章解答了我心中的疑問&#xff0c;那就是操作系統會自動調度cpu資源來處理多進程&#xff0c;多線程的并發。早在上世紀90年代末&#xff0c;就有眾多業界人士呼吁用CMP(單芯片多處理器)技術來替代復雜性較高的單線程CPU。IBM、惠普、Sun等高端服務器廠商&#xff0c;更是…

Java網絡編程二:Socket詳解

Socket又稱套接字&#xff0c;是連接運行在網絡上兩個程序間的雙向通訊的端點。 一、使用Socket進行網絡通信的過程 服務端&#xff1a;服務器程序將一個套接字綁定到一個特定的端口&#xff0c;并通過此套接字等待和監聽客戶端的連接請求。 客戶端&#xff1a;客戶端程序根據你…

Android之提示Could not find com.android.support:appcompat-v7:25.3.1.

1 問題 編譯第三方項目&#xff0c;錯誤提示如下 Could not find com.android.support:appcompat-v7:25.3.1. Required by:project :sampleproject :sample > com.yanzhenjie:permission:1.0.7project :sample > com.yanzhenjie.alertdialog:alertdialog:1.0.1 Search …

在 .NET 中使用 FixedTimeEquals 應對計時攻擊

計時攻擊 在計算機安全中&#xff0c;計時攻擊&#xff08;Timing attack&#xff09;是旁道攻擊 &#xff08;Side-channel attack&#xff09; 的一種&#xff0c;而旁道攻擊是根據計算機處理過程發出的信息進行分析&#xff0c;包括耗時&#xff0c;聲音&#xff0c;功耗等…

解讀大型網站系統架構的演化

解讀大型網站系統架構的演化 大型網站的架構是根據業務需求不斷完善的&#xff0c;根據不同的業務特征會做特定的設計和考慮&#xff0c;本文只是講述一個常規大型網站會涉及的一些技術和手段。作者&#xff1a;李平來源&#xff1a;LEE的博客前言 一個成熟的大型網站&#xff…

【ArcGIS風暴】西北地區氣象臺站年均NDVI與年均氣溫和降水的相關性分析

在研究植被動態變化與氣候的關系時,通常通過計算植被NDVI值與氣溫和降水的相關系數來描述相關性的大小。如下圖所示,計算了西北地區分布的氣象臺站與氣溫和降水的相關性并作圖可視化。 下面詳細說明整個實現過程。 一、計算相關系數 1. 原理分析 通過計算年均N…

python 全解坦克大戰 輔助類 附完整代碼【雛形】

我正在博客之星評選&#xff0c;歡迎投票給我 會從投票人中抽獎機械鍵盤書&#xff0c;中了會私聊地址 投票連接是&#xff1a;https://bbs.csdn.net/topics/603955346 投票連接是&#xff1a;https://bbs.csdn.net/topics/603955346 投票連接是&#xff1a;https://bbs.csdn.…

vc++ mfc中拖動效果的實現 借助于CImageList

拖動是界面編程頻繁使用的一個效果&#xff0c;在windows系統下可謂大行其道。縱觀時下的應用軟件幾乎各個都支持各種各樣拖動的效果&#xff0c;windows7更是把拖動做到了極致。其實說起來拖動的實現也很簡單&#xff0c;對于有句柄的對象都可以通過MoveWindow或SetWindowPos實…

從瀏覽器地址欄輸入url到顯示頁面的步驟

從瀏覽器地址欄輸入url到顯示頁面的步驟(以HTTP為例)- 在瀏覽器地址欄輸入URL- 瀏覽器查看緩存&#xff0c;如果請求資源在緩存中并且新鮮&#xff0c;跳轉到轉碼步驟 - 如果資源未緩存&#xff0c;發起新請求 - 如果已緩存&#xff0c;檢驗是否足夠新鮮&#xff0c;足夠…

有序的Map集合--LinkedHashMap

提出問題&#xff1a; 在寫一個dao的時候&#xff0c;我的需求是這個dao是一個萬能的&#xff0c;目前的方法只有一個查詢出實體類對應的表中所有的數據&#xff0c;通過傳入的對象&#xff0c;利用反射獲取實體類中的屬性名&#xff0c;屬性類型&#xff0c;利用字符串拼接獲取…

Leetcode之僅僅反轉字母

1 題目 給定一個字符串 S,返回 “反轉后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置發生反轉。 示例 1:輸入:"ab-cd" 輸出:"dc-ba" 示例 2:輸入:"a-bC-dEf-ghIj" 輸出:"j-Ih-gfE-dCba" 示例 3:輸入:&qu…

【SignalR全套系列】之在.Net Core 中實現長輪詢

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請后臺留言 源碼;前文回顧【SignalR全套系列】之在.Net Core 中實現Server-Send Events消息推送【SignalR全套系列】之在.NetCore中實現WebSocket雙工通信【SignalR全套系列】之在.N…

完美解決ArcGIS10.2和Erdas9.2軟件沖突的方法:共存!

用過ArcGIS和Erdas軟件的都知道&#xff0c;二者存在著服務的沖突&#xff0c;為了解決共存的問題&#xff0c;筆者曾多次重裝系統&#xff0c;但未能如愿以償。其實不需要相互關閉服務如此麻煩。那如何在安裝有arcgis的電腦安裝erdas并解決沖突呢&#xff1f;直接上視頻教程。…

架構師之路16年精選50篇

2016精選索引&#xff0c;點擊標題閱讀相關文章。【方法論】《秒殺系統架構優化思路》《分布式ID生成器》《互聯網架構&#xff0c;如何進行容量設計》《線程數究竟設多少合理》《單點系統架構的可用性與性能優化》《關于負載均衡的一切》《異構服務器負載均衡及過載保護》《LV…

yii 前后臺分離及登陸驗證

2019獨角獸企業重金招聘Python工程師標準>>> 比較合理的做法其實是分成兩個框架來布署&#xff1b;然而這樣說法也太絕對。 事實上是針對不同系統&#xff0c;應采用不同的方法。如為CMS系統&#xff0c;則不需很復雜的權限管理&#xff0c;但如果有管理員與會員之分…