IDispose是必要的,垃圾收集器是否工作在循环结束等
我的问题是关于IDisposable的实现。据我所知,当代码或部分完成时,变量或实例被处置;如果陈述错误,请纠正我。后续是我计划的一部分:IDispose是必要的,垃圾收集器是否工作在循环结束等
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变量的情况下,在这里,会不会有任何改善记忆,如果我X(或StockRoster)将使用IDisposable接口?
在每个循环结束时默认情况下资源是否会被处置?
IDisposable
是关于处置非托管资源,如数据库连接。它与垃圾收集没有任何关系。
您的StockRoster
类似乎不占用非托管资源,因此它不需要执行IDisposable
。即使这样做,将它置于for
循环中也没有意义,因为您将该实例添加到稍后使用的结果列表中。将它放在for
循环中会导致实例在调用代码中不可用。
首先,如果连接处于打开状态,您将永远不会输入If-clause
f.e.在有例外的情况下。
其实连接就是最好的例子。请务必尽快关闭连接。最简单的方法是使用using-statement
,最后调用Dispose
(即使在例外的情况下)。所以它类似于Try/Catch/Finally
。 Connection.Dispose
也会隐式关闭它。
作为一条经验法则:使用using-statement
来实现IDisposable
(如上面的SqlCeCommand
)。
要回答你的问题实际:
会有任何改善记忆,如果我X(或StockRoster)将 使用IDispose类,无法将资源获取在每个循环的结束 默认配置?
什么是改善记忆,IDisposable
是一个接口,你可以调用处理,甚至上课的时候没有实现IDisposable
接近。这只是一个暗示,它可能使用非托管资源,应尽快处理。
感谢您的信息。 – surpavan 2012-07-25 20:40:56
感谢您的信息。 – surpavan 2012-07-25 20:41:29