《编程的奥秘》一书的第4.1章节中有一个控件搬家的实例。当将form1窗体的Treeview1控件搬到form2中,紧接着关闭form2,再点击显示第二个窗体按钮,再点击form2按钮,就发生错误,告诉你对象已经释放。在修改form2按钮的代码,增加判断条件:if me.ff.treeview1 is nothing then ,该条件为真。说明该对象变量的值不是nothing,但该对象变量指向的对象已经被释放了,所以,这个判断条件不成立,应改为:if me.ff.treeview1.disposed then。改为判断对象是否已经释放就可以了。
Nothing与Dispose是否都能销毁对象,在编程中如何使用?
1、Nothing:表示任意数据类型的默认值,如:Integer类型的是0,对象类型的表示不与任何对象发生关联。如果一个对象只关联一个对象变量,将对象变量设为Nothing后,由GC终止对象并回收。如果一个对象关联多个对象变量,对象并不会终止。将一个对象设置为Nothing并不会终止对象本身,何时终止,由GC(垃圾回收器)决定,而GC的运行是不确定的。将对象变量设为Nothing并不能显式的释放对象。
实例:有两个Form,分别是Form1、form2,form1是启动窗体。
Public Class Form1
Dim A, B As Form2
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
A = New Form2
B = A
A.Show()
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
A.Hide()
A = Nothing
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
B.Show()
End Sub
End Class
当引用变量超出它的作用域时,对象的引用就会被清除,当对象的所有引用变量都清除了时,对象也就被销毁。将对象变量赋值为Nothing,是从VB6遗留的习惯。如果习惯了,可以继续。
2、Dispose:释放对象,适用于释放非托管的对象的资源,如文件句柄、数据库连接。Dispose是显式的释放对象。如果在编程中打开了文件句柄、数据库连接,显式的释放对象是必须的。当没有Dispose方法时,也可以调用对象的Close方法。如打开一个文件流Dim fs as new io.filestream("filename.txt",io.filemode.create) ,使用完后,应fs.close()或fs.dispose()。
2、Dispose:释放对象,适用于释放非托管的对象的资源,如文件句柄、数据库连接。Dispose是显式的释放对象。如果在编程中打开了文件句柄、数据库连接,显式的释放对象是必须的。当没有Dispose方法时,也可以调用对象的Close方法。如打开一个文件流Dim fs as new io.filestream("filename.txt",io.filemode.create) ,使用完后,应fs.close()或fs.dispose()。
昨天看到金旭亮的微博里说:close方法并没有销毁对象,而是隐藏。比如窗体对象,使用close后,相当于Hide。(此问题没有深究)