我以前从未在这个论坛上发帖,但是在研究中使用它很多,但这次我找不到答案......也许我只是没有正确写字。
我在一个Compact Framework项目中使用SqlCeCommand已经有一段时间了,并且在内存不足时出现了很多问题,所以我试图更好地优化非托管代码部分。
看看这个:
Dim SQLCmd as SQLCeCommand
SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
SQLCmd.Dispose()
这样可以,或者每当我在同一个对象上调用New时,我是否会丢失内存?之所以我这样做而不是保持对象的同一个实例是因为我不必每次都显式设置SQLCmd属性。因为有些人可能会使用参数,有些可能不会这样,所以我认为使用new会更容易确保一切都清晰。
任何想法或更好的方法来解决这个问题?
答案 0 :(得分:0)
在你的代码中,每次调用New时,先前的引用都会丢失,然后它就是垃圾收集器工作,即释放现在的未引用对象。当垃圾收集器框架确定是时候恢复内存并因此不会立即发生时会发生这种情况
为了做得更好,您可以使用Using statement
Dim SQLCmd as SQLCeCommand
Using SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
End Using
Using SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
End Using
Using SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff
End Using
通过这种方式,您可以自动为前一个SqlCmd调用Dispose,并向垃圾收集器提供一个强有力的提示来收集未使用的内存。
来自MSDN
Managed resources are disposed of by the .NET Framework garbage collector (GC) without any
extra coding on your part. You do not need a Using block for managed resources. However,
you can still use a Using block to force the disposal of a managed resource instead of
waiting for the garbage collector.