如题,用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的话 你就会发现你程序占用内存越来越大 而且如果其他操作需要读取你那个文件 或者要写入的话 会异常