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。(此问题没有深究)
  • 相关阅读:
    Spring 注解大全
    sql相关
    深入理解Java虚拟机 自己编译JDK
    MarkDown语法 学习笔记 效果源码对照
    学习
    【转】Java方向如何准备BAT技术面试答案(汇总版)
    Java (PO,VO,DAO,BO,POJO,DTO) 几种对象解释
    Python实现脚本锁功能,同时只能执行一个脚本
    java 内存管理 —— 《Hotspot内存管理白皮书》
    vue子组件实时获取父组件传来的值
  • 原文地址:https://www.cnblogs.com/shuiguang/p/2035414.html
Copyright © 2011-2022 走看看