反編譯分析C#閉包

一、問題描述:

比如有這樣的代碼:

它的輸出結果是 3,3,3。

通過搜索得知這一現象是因為C#閉包導致的.

我們借助ILSpy看下IL中間代碼,首先它生成了一個名叫DisplayClass的類,類中定義了i的字段

主代碼:

在for循環外,定義了DisplayClass的實例,并且對DisplayClass.i進行賦值

其次看下i++實現,是針對DisplayClass.i進行了自增操作。

我們可以對這段代碼再進行AI翻譯,所以最終執行輸出的a.i是最新值3

var actions = new List<Action>(); 
DisplayClass a=new DisplayClass();
a.i=0;
while(a.i<3){actions.Add(() => Console.WriteLine(a.i));a.i=a.i+1;
}

二、解決方式

解決閉包也很簡單,就是用局部變量進行賦值

我們再反編譯分析下原理

它是在for循環里面生成的DisplayClass的實例,相當于每循環一次都會生成一次實例,那么匿名函數持有的是局部變量DisplayClass實例,所以就能輸出正確的值。

總結:

匿名函數引用外部變量i,會在定義變量i的時候實例化一個DisplayClass類,類中聲明了i的字段。

1.如果是引用的循環體外的變量,那么每個匿名函數都持有的同一個DisplayClass實例,會導致輸出的結果都是最新的值。

2.如果是引用的循環體內的變量,那么每個匿名函數都持有與之對應的DisplayClass實例,能保證值輸出正確,但也會帶來相應的GC開銷。

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

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

相關文章

卷積神經網絡(CNN):從圖像識別原理到實戰應用的深度解析

目錄一.CNN的技術必要性&#xff1a;破解傳統圖像處理的兩大核心痛點痛點1&#xff1a;特征依賴人工設計&#xff0c;通用性差痛點2&#xff1a;全連接網絡參數爆炸&#xff0c;訓練難收斂二.CNN的核心原理&#xff1a;兩大機制與分層感知邏輯1.核心機制1&#xff1a;局部連接&…

用 SPL 編寫阿里云 FC2.0 函數

前言 在數字化轉型持續加速的背景下&#xff0c;企業越來越多地將業務邏輯以服務化方式部署至云端。阿里云函數計算&#xff08;Function Compute&#xff0c;簡稱FC&#xff09;作為一種無服務器計算平臺&#xff0c;屏蔽了底層資源運維的復雜性&#xff0c;使開發者能夠專注…

AR 巡檢與普通巡檢有哪些區別,有哪些優勢|阿法龍XR云平臺

AR 巡檢&#xff08;增強現實巡檢&#xff09;與普通巡檢&#xff08;傳統人工巡檢&#xff09;在技術應用、效率、準確性等多個維度存在顯著差異&#xff0c;具體區別如下&#xff1a; 1. 巡檢方式更智能 普通巡檢&#xff1a;依賴人工現場觀察&#xff0c;主要通過眼看、手…

Java中的volatile關鍵字詳解

核心作用&#xff1a;解決可見性和有序性問題volatile 的主要作用可以歸結為兩點&#xff1a;1.保證變量的可見性 和 禁止指令重排序。2.它提供了一種輕量級的同步機制&#xff0c;3.但需要注意的是&#xff0c;它不能保證原子性。保證可見性&#xff1a;什么是可見性問題&…

【Linux】MySQL數據目錄遷移步驟(含流程圖踩坑經驗)

在生產環境中&#xff0c;有時候你會遇到一些看似簡單但實際上很棘手的問題。最近我就碰到了一次典型的服務器磁盤空間告急&#xff0c;最后通過遷移 MySQL 數據目錄成功解決了問題。本文記錄整個過程&#xff0c;包括我的分析思路、遷移步驟、踩坑和經驗總結&#xff0c;希望對…

數據驅動下的連鎖模式復制:技術科普與方法論深度解析

前言在連鎖經營的賽道上&#xff0c;“復制”是核心命題&#xff0c;但絕非簡單的“粘貼”。當行業進入數字化深水區&#xff0c;數據驅動正成為連鎖模式突破增長瓶頸、實現高效復制的“隱形引擎”。本文將從技術科普與方法論心得兩個維度&#xff0c;深度拆解數據如何重塑連鎖…

數據庫學習MySQL系列2、Windows11系統安裝MySQL方法一.msi安裝詳細教程

方法一.msi安裝詳細教程 Windows系統下MySQL——.msi安裝詳細教程&#xff08;默認--只安裝服務端“Server only”&#xff09;MySql官網地址&#xff1a;https://www.mysql.com/&#xff1b;快速下載通道請單擊→ No thanks, just start my download.ps&#xff1a;其他資源(…

html+css+vue實現增刪改查

代碼如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>優化版 Vue.js CRUD 示例&l…

(計算機網絡)DNS解析流程及兩種途徑

在計算機網絡中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 將域名解析為 IP 地址。一個完整的解析過程涉及 遞歸查詢、迭代查詢&#xff0c;以及多個關鍵角色&#xff08;LDNS、本地域名服務器&#xff1b;根服務器&#xff1b;頂級域名服務器&#xff1b…

數據結構——隊列(Java)

一.基本概念 隊列用來存儲邏輯關系為“一對一”的數據&#xff0c;是一種“特殊”的線性存儲結構。 特點&#xff1a; ?先進先出&#xff1a;隊列中元素的添加&#xff08;入隊enqueue&#xff09;和移除&#xff08;出隊dequeue&#xff09;遵循先進先出的原 則。 ?端點&…

【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…

【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

概述&#xff1a;本篇是接著上一篇&#xff0c;細分出說明書的編寫部分&#xff0c;實現這個功能的需求&#xff0c;是內部很多同事反饋&#xff0c;需要有個地方存工具&#xff0c;并且可以寫說明書&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下載工具和查看工…

Mac設置中的安全性缺少“任何來源”

問題&#xff1a;用Mac安裝軟件&#xff0c;隱私性與安全性&#xff0c;想切換“任何來源”用來下載網站的app&#xff0c;但是菜單欄找不到“任何來源”選項&#xff0c;無法安裝dmg的文件終端中一行代碼設置出來&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

uniapp開發小程序,列表 點擊后加載更多數據

一、需求 1.初始顯示限制:將每頁條數limit改為5,確保初始只顯示5條數據 2.查看更多功能:添加了loadMore方法,點擊"查看更多"時加載下一頁數據 3.實現查看更多功能,點擊后加載更多數據 4.添加loading狀態防止重復請求 添加hasMore狀態判斷是否還有更多數據 …

Windows 部署 Gerrit 與 Apache24 配置

Windows 部署 Gerrit 與 Apache24 并配置反向代理 準備工作 下載并安裝 Java JDK 確保配置 JAVA_HOME 環境變量博主這里安裝openjdk21 https://jdk.java.net/archive/下載所需軟件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

從 Excel 趨勢線到機器學習:拆解 AI 背后的核心框架?

引言&#xff1a;你其實早就 “玩轉” 過機器學習&#xff1f;提到 “機器學習”&#xff0c;你是不是第一時間聯想到復雜的代碼、密密麻麻的公式&#xff0c;還有那些讓人頭暈的 “算法”“模型”“訓練” 術語&#xff1f;仿佛它是高高在上的技術&#xff0c;離我們的日常無比…

Lenovo聯想YOGA Pro 16 IAH10 2025款筆記本電腦(83L0)開箱狀態預裝OEM原廠Win11系統

適用機型(MTM)&#xff1a;【83L0】 鏈接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取碼&#xff1a;qy2r 聯想原裝系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、聯想瀏覽器、電腦管家、…

Android 開發 - 一些畫板第三方庫(DrawBoard、FingerPaintView、PaletteLib)

一、DrawBoard 1、Dependencies 模塊級 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

捷多邦揭秘超厚銅板:從制造工藝到設計關鍵環節?

一、超厚銅板制造工藝要點超厚銅板&#xff08;3oz 及以上&#xff09;的制造工藝對精度和穩定性要求嚴苛&#xff0c;核心環節需突破多重技術壁壘。蝕刻工藝中&#xff0c;因銅箔厚度達 105μm 以上&#xff0c;需采用高濃度酸性蝕刻液&#xff08;氯化銅濃度控制在 180-220g/…