当前位置: 代码迷 >> VB Dotnet >> 用new创建的对象实例,在子程序运作完毕的时候,是否会自动销毁
  详细解决方案

用new创建的对象实例,在子程序运作完毕的时候,是否会自动销毁

热度:151   发布时间:2016-04-25 02:00:27.0
用new创建的对象实例,在子程序运行完毕的时候,是否会自动销毁
如题,用new创建的对象实例,在子程序运行完毕的时候,是否会自动销毁,例如下边这段代码,如果我不去关闭StreamReader会怎么样,

        Dim srObject As System.IO.StreamReader
        Dim arrlTemp As New ArrayList
        Dim strTemp As String
        Dim intI As Integer
        Try
            srObject = New System.IO.StreamReader("C:\1.TXT", System.Text.Encoding.Default)
            strTemp = srObject.ReadLine()
            With srObject
                While Not strTemp Is Nothing
                    arrlTemp.Add(strTemp)
                    strTemp = .ReadLine
                End While
                .Close()'这句代码去掉
            End With
            srObject = Nothing'这句代码去掉
         
            If arrlTemp.Count >= 2 Then
                arrlTemp(1) = "00000000"
            End If
            If arrlTemp.Count > 0 Then
                Dim swObject As System.IO.StreamWriter
                swObject = New System.IO.StreamWriter("C:\1.TXT", False, System.Text.Encoding.Default)
                For intI = 0 To arrlTemp.Count - 1
                    swObject.WriteLine(arrlTemp.Item(intI))
                Next
                swObject.Close()'这句代码去掉
                swObject = Nothing'这句代码去掉
            End If
        Catch ex As Exception
        End Try

------解决思路----------------------
三个概念
1:值类型对象
这种类型对象是直接在栈上面分配 在函数调用时候其本身是会复制一份然后压栈到调用函数的入口 函数调用结束该类型出栈 也就是自动被释放
为何值类型能够被直接释放 是因为其大小是固定的 可以在栈上面做线性的分配
2:引用类型对象
这种类型对象是分配在堆中 你拿到的是个引用 函数调用时候是将其引用地址复制后压栈到调用函数入口 调用结束该引用地址的拷贝也出栈 但是其本身并没有被销毁 他的销毁是由GC控制 具体的理论就复杂了 
3:非托管资源
非托管资源是不属于CLR控制的 一般情况下是需要手动去释放 注意这里指的是资源而不是对象 对象有时候被销毁了但是非托管资源则未必会被销毁

你的代码里面 swObject.Close()这句代表释放非托管资源 swObject = Nothing代表的是swObject 没有引用了 从某种角度上讲是可以加快GC判断是否将该对象GC掉的  然而其实并没有什么卵用
不关闭swObject的话 你就会发现你程序占用内存越来越大 而且如果其他操作需要读取你那个文件 或者要写入的话 会异常
  相关解决方案