C#和VisualBasic中的闭包与对象生存时期
C# 2和即将到来的VB 9都允许开发者在匿名方法中引用局部变量。如果在匿名方法中引用了一个变量,那么这个局部变量将被提升为一个实例变量,并存储在一个名为closure的对象中。提升后,即使创建该变量的方法被执行并退出,该变量也不会消亡。
当所有对匿名函数的引用消失时,闭包变量可以被垃圾收集器正常收集。注意,上一句中的“匿名函数”是复数形式(原文是匿名函数——译者注)——因为同一作用域内的所有匿名函数共用一个闭包。Eric Lippert说,这个问题没有得到足够的重视:
但是,我还没有看到有人提到,同一个作用域内的所有匿名函数共享一个闭包。尽管这种设计在语义和概念上都很容易理解(和实现),但它可能会导致垃圾收集中的潜在问题。
位律师回复
0条评论