局部函數(shù),匿名函數(shù),可以直接在函數(shù)體內(nèi)使用局部變量。
如果作為委托使用,傳遞給別人??赡茉趧e人使用委托的時候,這些局部變量的作用域就已經(jīng)消失了。
因此,編譯器會對這些變量做出特殊的操作,將這些變量封裝在一個類里面(編譯器自己創(chuàng)建的類)。
在原變量出了作用域后,因為在封裝類里面還有引用,不會被清除。
引用變量(ref變量,in參數(shù),out參數(shù)),和ref結(jié)構(gòu)不允許被捕獲。
委托捕獲的變量是以引用傳遞的方式使用的。
也就是說,如果使用和捕獲之間修改了捕獲的變量,那么使用時是修改后的結(jié)果。
Action act =null;
for (int i = 0; i< 10; i++)
{act += () =>Console.WriteLine(i);
}
act();//輸出結(jié)果全是10
如果希望使用聲明委托當(dāng)時的值,只需要另外聲明一個局部變量進(jìn)行復(fù)制操作。
引用類型的復(fù)制可能需要使用深拷貝。
Action act =null;
for (int i = 0; i< 10; i++)
{int j=i;
act += () =>Console.WriteLine(j);
}
act();//輸出0到9
附注foreach循環(huán)和for循環(huán)不同。
foreach循環(huán)是一個語法糖,在編譯后不會呈現(xiàn)出foreach循環(huán),而是while循環(huán)。
然后,在foreach循環(huán)中生命的變量,在編譯后,是在while循環(huán)內(nèi)聲明的。
也就是說foreach循環(huán)中捕獲item,不會出現(xiàn)上述for循環(huán)的問題。
int[] i = {1, 2, 3, 4, 5 };
Action action = null;
foreach (var item in i)
{action += () =>Console.WriteLine(item);
}
action();//確實是1,2,3,4,5
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
新聞名稱:c#入門-捕獲變量-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article46/djejhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、云服務(wù)器、自適應(yīng)網(wǎng)站、建站公司、網(wǎng)站制作、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容