VB .net中用于检查对象是否已被丢弃的正确语法是什么?
在我的情况下,公共声明的数据库连接(dbLocal
)由USING块处理,再次调用数据库连接会触发错误。
我已尝试实施.IsDisposed
代码here,但声明需要获取,我不完全确定如何添加。
一旦我可以检查它.isdisposed,重建公共对象的正确方法是什么?
DB声明:
Public dbLocal As New SQLiteConnection("Data Source=" & Replace(Application.StartupPath, "\", "\\") & "\\database.db;FailIfMissing=True")
USING循环:
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
答案 0 :(得分:1)
您不需要检查物品的处理情况。
理想情况下,你应该将它包装在这样的使用块中:
Using obj As New foo
'use your object
End Using
下次使用时,将代码包装在另一个使用块中。
我认为您的问题不是在使用块的开头创建新对象。你可能想要这个:
Using dbLocal As New SQLiteConnection("Data Source=" & Replace(Application.StartupPath, "\", "\\") & "\\database.db;FailIfMissing=True")
'...
End Using
此处dbLocal
的范围仅适用于Using
块的生命周期。目前,您正在使用一个全局变量,该变量将在End Using
行处理。
答案 1 :(得分:1)
一般而言,如果一个人不知道某个项目是否被处置,那么人们对其状态的了解不足以执行任何取决于其状态的操作。包含通知方法的类应该以这样的方式编写它们,使得它们可以在任何状态下被安全地调用(当对象处于不关心它们的状态时,它应该简单地忽略通知)。在大多数情况下,模式:
if (!thing.IsDisposed)
thing.DoSomething();
是有意义的,该模式应该在<{em>} {/ 1}}本身的类中实现<例如因为thing
通常用于通知控制他们可能正在监视的属性的更改,BeginInvoke
应该(但不)具有Control
方法,如果控制不能接受它]。偶尔(与TryBeginInvoke
一样,人们不得不在没有这种方法的情况下解决问题,但通常情况下,唯一一个人不知道某件事情是否已被处置的事情,如果事情可以被置于一个人的控制之外;那么情况,即使Control.BeginInvoke
返回false,也可能不知道情况会持续多久。
答案 2 :(得分:1)
尽管OP的问题似乎是他们在使用using语句而没有理解其含义,但读者可能希望对标题实际提出的问题有一个清晰的答案。
不幸的是,答案是只能通过try / catch判断,不幸的是,必须捕获的异常取决于资源。我个人认为这是IDisposable接口的一个失败,但是已经完成了工作,并且正如已经提到的那样,无论如何人们都不知道这将是正确的时间。
大多数已处置对象抛出InvalidOperationException,但这只是一个约定。除非您有有关该对象的文档,否则只能通过有意布置实例并尝试查看它引发的内容来确定。