VB.NET中检查StreamReader是否打开引发警告,如何正确关闭不确定对象?
正确处理StreamReader的关闭与释放问题
原代码的核心问题是:SR仅在Try块内完成初始化,若New StreamReader(...)抛出异常,SR会保持未赋值状态,直接在wrapup块中调用其方法必然触发“未赋值即使用”的警告,甚至引发空引用异常。同时重复调用Close和Dispose属于冗余操作——Dispose方法会自动完成流的关闭与资源释放。
最优解决方案:使用Using语句
VB.NET的Using语句会自动管理实现了IDisposable接口的对象,无论代码正常执行还是抛出异常,都会确保对象被正确释放,完全无需手动处理关闭逻辑:
Using SR As New StreamReader(...) ' 在这里执行文件操作 Catch ex As Exception MsgBox(ex.Message, vbOK, "Error opening File") End Using
手动处理的正确写法(不推荐,仅作理解用)
如果必须手动控制资源生命周期,需先判断SR是否已初始化,再执行释放操作,且只需调用一次Dispose(或Close,两者效果一致,Close内部最终会调用Dispose):
Dim SR As StreamReader = Nothing Try SR = New StreamReader(...) ' 执行文件操作 Catch ex As Exception MsgBox(ex.Message, vbOK, "Error opening File") Finally ' 先判断对象是否存在,再释放 If SR IsNot Nothing Then SR.Dispose() End If End Try
注意:原代码中的GoTo跳转逻辑不利于代码可读性,推荐用Finally块替代,它会在Try/Catch执行完成后必然执行,是处理资源清理的标准方式。
内容的提问来源于stack exchange,提问作者Ernesto
相关产品推荐
相关产品推荐

