已实现IDisposable的VB.NET类在Using语句中仍报错问题排查
问题原因与解决方案
你遇到的问题核心很明确:List(Of QueryParamClass)本身并没有实现IDisposable接口,哪怕它存储的QueryParamClass实现了这个接口,Using语句也只认当前对象的接口实现,不会递归处理泛型元素。
解决方法
1. 手动遍历释放List中的元素
如果不想修改现有结构,用完List后手动遍历每个QueryParamClass实例调用Dispose即可:
Dim paramList As New List(Of QueryParamClass)() ' 填充参数列表、批量处理查询的逻辑 ' 处理完成后清理 For Each param In paramList param.Dispose() Next paramList.Clear()
2. 封装实现IDisposable的自定义容器类
如果想在Using语句里直接管理整个列表的释放,可以自己写一个继承自List(Of QueryParamClass)并实现IDisposable的容器:
Public Class QueryParamList Inherits List(Of QueryParamClass) Implements IDisposable Private disposedValue As Boolean Protected Overridable Sub Dispose(disposing As Boolean) If Not disposedValue Then If disposing Then ' 释放托管资源:遍历所有元素调用Dispose For Each item In Me item.Dispose() Next Me.Clear() End If disposedValue = True End If End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(disposing:=True) GC.SuppressFinalize(Me) End Sub End Class
之后就可以正常用Using包裹这个自定义容器了:
Using paramList As New QueryParamList() ' 填充参数、批量处理查询 End Using
3. 单个实例使用Using(适合逐个处理场景)
如果你的批量处理是逐个处理每个参数对象,也可以在创建单个QueryParamClass时就用Using:
Dim paramList As New List(Of QueryParamClass)() For Each query In rawQueries Using param As New QueryParamClass() ' 设置param的参数 ' 直接调用处理函数处理当前param(不建议存入List后再处理,避免引用已释放实例) End Using Next
针对你的重构场景建议
因为你要批量处理300多个查询,推荐用自定义容器类的方案,既符合Using语句的语法习惯,又能确保所有参数对象的资源都被正确释放。另外要检查QueryParamClass的Dispose方法是否必要:如果你的类只是存储参数(比如字符串、数值类型),其实根本不需要实现IDisposable,只有当类持有数据库连接、文件句柄这类需要手动释放的资源时,才需要这个接口。
内容的提问来源于stack exchange,提问作者Hideval
相关产品推荐
相关产品推荐

