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