在同一个对象上多次调用new

时间:2012-09-29 10:04:41

标签: vb.net compact-framework sql-server-ce

我以前从未在这个论坛上发帖,但是在研究中使用它很多,但这次我找不到答案......也许我只是没有正确写字。

我在一个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会更容易确保一切都清晰。

任何想法或更好的方法来解决这个问题?

1 个答案:

答案 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.