检查项目是否已被处置的正确方法

时间:2014-04-23 10:28:19

标签: .net vb.net garbage-collection dispose

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

3 个答案:

答案 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,但这只是一个约定。除非您有有关该对象的文档,否则只能通过有意布置实例并尝试查看它引发的内容来确定。