国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

委托、Lambda表達式、事件系列05,Action委托與閉包

2019-11-17 02:51:08
字體:
來源:轉載
供稿:網友

委托、Lambda表達式、事件系列05,Action委托與閉包

來看使用Action委托的一個實例:

        static void Main(string[] args)
        {
            int i = 0;
            Action a = () => i++;
            a();
            a();
            Console.WriteLine(i);
        }

12

結果是期望能的2。但令人好奇的是:棧上的變量i是如何傳遞給Action委托的?

反編譯進行查看,首先看Main方法對應的IL代碼:

13

再看c_DisplayClass1的IL代碼:

14

從中可以看出:→在托管堆上創建了一個名為c_DisplayClass1的實例→把棧上變量i的值賦值給了c_DisplayClass1的實例字段i→編譯器() => i++;Lambda表達式表示的匿名委托起了個<Main>b_0的方法名,并成為了c_DisplayClass1的實例方法→把c_DisplayClass1的實例方法<Main>b_0賦值給Action委托變量→最后調用委托2次,這2次都是針對c_DisplayClass1的實例字段i

換句話說,在托管堆上創建了對象實例,形成"閉包"。棧上的變量變成了閉包的實例字段,Lambda表達式所表示的匿名委托變成了閉包的實例方法。

以上,創建了一個Action,形成了一個"閉包",接下來創建2個Action,形成2個"閉包",看"閉包"的實例字段是否相互影響?

        static void Main(string[] args)
        {
            Action a = GetAction();
            Action b = GetAction();
            Console.Write("第一次調用a,i的值=");
            a();
            Console.WriteLine();
            Console.Write("第二次調用a,i的值=");
            a();
            Console.WriteLine();
            Console.Write("第一次調用b,i的值=");
            b();
            Console.WriteLine();
        }
        static Action GetAction()
        {
            Action result = null;
            int i = 0;
<PRe style="font-size: 11px; font-family: consolas,'Courier New',courier,monospace; width: 100%; margin: 0em; background-color
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通江县| 乌审旗| 临安市| 尚义县| 冷水江市| 兰州市| 定陶县| 池州市| 苏尼特右旗| 横山县| 西平县| 隆安县| 右玉县| 长宁区| 新民市| 巴彦县| 论坛| 林甸县| 大名县| 茂名市| 闵行区| 略阳县| 晋州市| 三明市| 金川县| 丰原市| 浠水县| 西畴县| 定襄县| 青田县| 获嘉县| 临潭县| 平遥县| 正宁县| 汉阴县| 盘山县| 中阳县| 桓台县| 仙桃市| 枝江市| 菏泽市|