C# 2和即將發(fā)布的VB 9都允許開發(fā)者在匿名方法中引用局部變量。若某匿名方法中引用了某個(gè)變量,則該局部變量將被提升為實(shí)例變量,并儲(chǔ)存于一個(gè)叫做閉包(closure)的對象中。提升之后,即使創(chuàng)建該變量的方法執(zhí)行完畢退出,該變量仍不會(huì)消亡。
當(dāng)指向該匿名函數(shù)的所有引用都消失后,該閉包變量即可正常地被垃圾回收器回收。注意到前一句中的“匿名函數(shù)”是復(fù)數(shù)形式(原文為anonymous functions——譯者注)——因?yàn)橥粋€(gè)作用域中所有的匿名函數(shù)都共享了一個(gè)閉包。Eric Lippert說這個(gè)問題并沒有受到足夠的關(guān)注:
不過,對于同一個(gè)作用域中所有的匿名函數(shù)都共享了一個(gè)閉包的做法,我卻沒有看到任何人提到過這樣會(huì)存在問題。雖然這樣的設(shè)計(jì)在語義和概念上都比較容易理解(也比較容易實(shí)現(xiàn)),但在垃圾收集方面,這樣的做法卻有可能導(dǎo)致潛在的問題。
當(dāng)指向該匿名函數(shù)的所有引用都消失后,該閉包變量即可正常地被垃圾回收器回收。注意到前一句中的“匿名函數(shù)”是復(fù)數(shù)形式(原文為anonymous functions——譯者注)——因?yàn)橥粋€(gè)作用域中所有的匿名函數(shù)都共享了一個(gè)閉包。Eric Lippert說這個(gè)問題并沒有受到足夠的關(guān)注:
不過,對于同一個(gè)作用域中所有的匿名函數(shù)都共享了一個(gè)閉包的做法,我卻沒有看到任何人提到過這樣會(huì)存在問題。雖然這樣的設(shè)計(jì)在語義和概念上都比較容易理解(也比較容易實(shí)現(xiàn)),但在垃圾收集方面,這樣的做法卻有可能導(dǎo)致潛在的問題。