0

我的问题是关于 IDisposable 的实现。据我所知,当代码或部分完成时,变量或实例被释放;如果陈述有误,请纠正我。以下是我的程序的一部分:

 If Con.State = ConnectionState.Closed Then Con.Open()
        Cmd = New SqlCeCommand("Select * from BillItem", Con)
        Rdr = Cmd.ExecuteReader()
        While Rdr.Read = True
            Dim x As New Classes.StockRoster
            x.BillID = Rdr("BillID")
            x.IsSales = Rdr("IsSales")
            x.Quantity = Rdr("Quantity")
            x.ContactBase = (From t As CommonCodes.ItemBase In ContactsbaseDict Where t.ID = BillContactDict(x.BillID)).First
            x.StockEntityBase = StockEntitydict(Rdr("StockID"))
            x.BillDate = Rdr("BillDate")
            result.AddRange(x)
        End While
        Con.Close()
 End IF

如果此处使用 X 变量,如果 I x(或 StockRoster)使用 IDisposable 接口,是否会改善内存?

默认情况下,资源不能在每个循环结束时处理吗?

4

2 回答 2

1

IDisposable是关于处置非托管资源,例如数据库连接。它与垃圾收集没有任何关系。

你的StockRoster类似乎没有非托管资源,所以它不需要实现IDisposable. 即使这样做了,在循环中处理它也没有意义for,因为您将实例添加到稍后将使用的结果列表中。在for循环中处理它会使实例在调用代码中不可用。

于 2012-07-25T20:02:27.450 回答
1

首先,如果连接打开,您将永远不会输入If-clause发生异常时可能发生的情况。

实际上,连接是最好的例子。始终尽快关闭连接。最简单的方法是在最后使用using-statementwhich 调用Dispose(即使出现异常)。所以它类似于Try/Catch/Finally. Connection.Dispose也会隐式关闭它。

作为一个经验法则:使用using-statement任何实现IDisposable(如SqlCeCommand上面)。

回答你的实际问题:

如果我 x(或 StockRoster)将使用 IDispose 类,是否会有任何内存改进,资源不能在每个循环结束时默认处理吗?

什么是内存改进IDisposable是一个接口,即使类没有实现,你也可以调用 dispose 或 close IDisposable。这只是暗示它可能使用非托管资源并应尽快处理。

于 2012-07-25T20:04:21.617 回答