zoukankan      html  css  js  c++  java
  • Nothing与Dispose的区别与使用

    《编程的奥秘》一书的第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()。
    昨天看到金旭亮的微博里说:close方法并没有销毁对象,而是隐藏。比如窗体对象,使用close后,相当于Hide。(此问题没有深究)
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/shuiguang/p/2035414.html
Copyright © 2011-2022 走看看