理论上,由于SqlCommand实现了IDisposable,因此应始终处理SqlCommand对象。我亲自用它们包装一个using语句。但是我看到很多代码从未处理过SqlCommand对象而没有任何明显的问题。
我知道终结器最终会被垃圾收集调用,但由于在大多数情况下可能需要很长时间(而且从不在其他情况下),为什么代码不会因为耗尽某些资源而崩溃?
在我们自己的代码库中,我们拥有全天候运行而无需处理命令的代码。我想清理它,但是当它没有引起任何问题时很难证明。
答案 0 :(得分:2)
在我看来它调用基类(Component)Dispose方法,然后跳转启动垃圾收集......
Public Sub Dispose(ByVal disposing As Boolean)
If disposing Then 'Same as Component.Dispose()
SyncLock Me
If Me.site IsNot Nothing AndAlso Me.site.Container IsNot Nothing Then
Me.site.Container.Remove(Me)
End If
If Me.events IsNot Nothing Then
Dim handler As EventHandler = DirectCast(Me.events.Item(Component.EventDisposed), EventHandler)
If handler IsNot Nothing Then
handler.Invoke(Me, EventArgs.Empty)
End If
End If
End SyncLock
End If
GC.SuppressFinalize(Me)
End Sub
我使用Reflector得到了这个。