【发布时间】:2014-04-23 10:28:19
【问题描述】:
在 VB .net 中检查对象是否已被释放的正确语法是什么?
在我的例子中,公开声明的数据库连接 (dbLocal) 由 USING 块处理,再次调用数据库连接会触发错误。
我已经尝试实现 .IsDisposed 代码 here 但声明需要一个 Get,我不完全确定如何添加。
一旦我可以检查它.isdisposed,重新创建公共对象的正确方法是什么?
数据库声明:
Public dbLocal As New SQLiteConnection("Data Source=" & Replace(Application.StartupPath, "\", "\\") & "\\database.db;FailIfMissing=True")
使用循环:
Using dbLocal
'Create Command & add parameters
Dim Typecmd As New SQLiteCommand(TypeSQLI, dbLocal)
With Typecmd.Parameters.Add("@id", DbType.String, 50, "id")
Typecmd.Parameters.Add("@description", DbType.String, 100, "description")
Typecmd.Parameters.Add("@sex", DbType.Int16, 1, "sex")
Typecmd.Parameters.Add("@master", DbType.String, 50, "master")
Typecmd.Parameters.Add("@size_min", DbType.String, 2, "size_min")
Typecmd.Parameters.Add("@size_max", DbType.String, 2, "size_max")
Typecmd.Parameters.Add("@size_half", DbType.Int16, 1, "size_half")
Typecmd.Parameters.Add("@lining", DbType.String, 2, "lining")
End With
Dim adapter As New SQLiteDataAdapter()
adapter.InsertCommand = Typecmd
Try
Dim iRowsInserted As Int32 = adapter.Update(typetable)
'Output result
LstProcessed.Items.Add(iRowsInserted & " records added.")
LstProcessed.TopIndex = LstProcessed.Items.Count - 1
Catch ex As Exception
MsgBox("Import error. " & Chr(13) & Chr(10) & "Check syntax of imported file (were there headers?).", MsgBoxStyle.Critical)
End Try
End Using
理想情况下,“IsDispose”函数会在进入 USING 循环之前检查数据库是否已关闭。
我添加了 IsDisposed 声明,如 MSDN 文章中所述,导致...
Public ReadOnly Property IsDisposed() As Boolean
Get
???
End Get
End Property
【问题讨论】:
-
发布一些代码。
dbLocal是什么?SqlConnection? -
没有通用的方法来获取已处置的对象并能够创建一个副本,就像该对象在处置之前一样。它可能已经执行了任意数量的清理,从而破坏了它在运行时保存的数据。 dispose 模式的全部意义在于,当 您 知道您不再需要此对象时,您调用
Dispose。如果您遇到的情况是您有一个对象并且不确定它是否已被处理,那么您使用它是错误的。 -
正如我上面所说,一旦 VB 完成 USING 循环,似乎数据库连接正在关闭。基本上记录在here
-
如果你在
Using语句中放置一些东西,你就是在告诉系统“当我们退出这个Using块时,我不再需要访问这个对象”。如果不是这样,那么不要使用using语句。
标签: .net vb.net garbage-collection dispose