析构函数作用:VB.NET的旅( 2)—构造和析构

  大李在Form1窗体例子被隐藏时候关闭了Form2窗体例子使我失去了对主线程人工控制进程无法正常关闭了只好使用Ctrl+Alt+Del调出系统进程管理器强行中止了该进程为了避免抬头看见大李笑脸我只好低头想办法

  有了我只要能截获Form2例子关闭消息不就可以再调出隐藏主线程窗体了吗?在Form2基类事件(Base Class Event)中重载Closing思路方法进行处理:

Private Sub Form2_Closing(ByVal sender As Object, ByVal e As _
.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        frm1.Show
    End Sub


  哈很方便我关闭了Form2窗体例子后被隐藏那个frm1又出现了

  “嗯”大李终于发话了“你再点击下Form1窗体上Button1试试

  我背心隐隐感觉大李等待着就是这个时候无奈我还只能照他说去做果然弹出个出错窗口.

VB.NET的旅( 2)—构造和析构

  “你关闭了frm2这个Form2例子也就结束了这个对象生存期”大李看来是蓄势已久了“这就是出错提示中所说‘无法访问名为Form2已处置对象’当我们关闭个窗口时候会发出个终止响应并将该窗口对象就象上面定义frm2送入终止队列公共语言运行库垃圾回收器跟踪着这个对象生存期此时就会此对象基类比如Form2Dispose思路方法用于销毁对象并收回资源所以……”

  “所以我只要判断下frm2是否被销毁就行了如果销毁了我就再构造个例子不就行了?”我恍然大悟道

  大李第次微笑地点了点头说:“用frm2.IsDisposed就可以来判断了

  我心领神会地写道:

Private Sub Button1_Click(ByVal sender As .Object, _
ByVal e As .EventArgs) Handles Button1.Click
        If frm2 Is Nothing Or frm2.IsDisposed Then  ‘判断对象是否被销毁
            frm2 = New Form2
        End If
        Me.Hide
        frm2.Show
    End Sub


  这下完善多了两个窗体的间切换也不会有这么多别扭问题了我转过身看到大李已经找了把椅子坐在我身边

  “你来说说对VB.NET窗体例子创建和销毁过程吧

  我整理了下凌乱思路长吁了口气开始说:“个窗体类比如Form1类是通过其基类就是Form类New思路方法来创建例子、Dispose思路方法来销毁例子

  “没错”大李边说话边在我中点击开来被代码窗口自动折叠起来" Windows 窗体设计器生成代码 ":

Public Sub New
        MyBase.New
        '该是 Windows 窗体设计器所必需
        InitializeComponent
        '在 InitializeComponent 的后添加任何
    End Sub
    '窗体重写处置以清理组件列表
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub


  大李开始解说道:“MyBase 关键字行为类似于引用类当前例子基类对象变量MyBase 常用于访问在派生类中被重写或隐藏基类成员在这段代码中MyBase指当然就是.Windows.Forms.Form类了构造对象时用New思路方法是显式没什么好解说但析构思路方法值得

  他看了我继续说:“Form.Dispose思路方法是重写自Control.Dispose思路方法那么Control.Dispose思路方法含义又是如何样?它作用就是:释放由Control占用非托管资源还可以另外再释放托管资源当它参数中disposing 为 true 则释放托管资源和非托管资源;为 false 则仅释放非托管资源 Form类disposing为true在关闭窗体时自动dispose功能是得益于.net公共语言运行库运行库自动处理对象布局和管理对对象引用当不再使用对象时释放它们其生存期以这种方式来管理对象称为托管数据自动内存管理消除了内存泄漏以及其他些常见编程任何类型 Dispose 思路方法都应该释放它拥有所有资源它还应该通过其父类型 Dispose 思路方法释放其基类型拥有所有资源该父类型 Dispose 思路方法应该释放它拥有所有资源并同样也其父类型 Dispose 思路方法从而在整个基类型层次结构中传播该模式要确保始终正确地清理资源Dispose 思路方法应该可以被多次安全而不引发任何异常

  “可是如果系统问题或应用上出了问题不能正常Dispose如何办?”我想起了什么问道

  “如果通过Dispose还释放不干净或没有Dispose系统垃圾回收器会对象 Finalize 思路方法进行清除由于执行 Finalize 思路方法会大大减损性能所以我们不会开始就用它去进行清除工作”大李稍微解释了



  我终于想起了个重要问题:“如果总是在模块中定义全局变量来处理由于访问范围太大会不会有安全性问题?”

  “当然我们可以试试其他解决方案”大李总是有备而言



Tags:  析构函数作用

延伸阅读

最新评论

发表评论