.net 仍然可以访问控件';在它被处理后,它的属性

.net 仍然可以访问控件';在它被处理后,它的属性,.net,vb.net,winforms,using,.net,Vb.net,Winforms,Using,我正在使用下面的模板来显示模式表单 Using tempForm As New CustomForm 'Do Something StaticClass.StaticMemeber = tempForm tempForm.ShowDialog End Using 'I can still access the properties of tempForm here MsgBox(StaticClass.StaticMemeber.Text) 'However t

我正在使用下面的模板来显示模式表单

Using tempForm As New CustomForm

    'Do Something

    StaticClass.StaticMemeber = tempForm
    tempForm.ShowDialog

End Using

'I can still access the properties of tempForm here
MsgBox(StaticClass.StaticMemeber.Text)

'However this below returns True
MsgBox(StaticClass.StaticMember.IsDisposed)


Public Class StaticClass

    Public Shared StaticMember as Control

End Class

有人能帮我理解为什么会这样吗。谢谢。

在垃圾收集器删除并释放它正在使用的内存之前,已释放的对象仍然存在。IDispose接口只是一种模式。实现该模式的对象应该做的一件事是在其被释放后返回属性和方法的ObjectDisposed exeception。然而,编译器或CLR中的任何内容都不会强制对象这样做,它只是编码对象的程序员应该实现的一种模式。在垃圾收集器实际删除obejct之前,您仍然可以访问其属性。在这种情况下,StaticMember仍然引用对象。GarabageCollector在释放该引用之前不会杀死该对象。

因此,当我在using块中初始化一个对象时,GC是否最终不会杀死该对象,即使来自另一个类的静态成员仍然持有对它的引用?只要来自另一个类的staic成员持有对它的引用,在程序正常运行期间,对象永远不会被垃圾收集。当进程终止时,它将最终与其他所有内容一起“收集”。using块所做的只是确保在退出using块时调用对象上的Dispose方法,即使using块中抛出异常也是如此。由对象在dispose方法中释放任何未管理或托管的资源。在dispose调用期间,对象不会自行销毁。只有gc才能做到这一点。