IDispose是必要的,垃圾收集器是否工作在循环结束等

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循环中会导致实例在调用代码中不可用。

+0

感谢您的信息。 – surpavan 2012-07-25 20:41:29

首先,如果连接处于打开状态,您将永远不会输入If-clause f.e.在有例外的情况下。

其实连接就是最好的例子。请务必尽快关闭连接。最简单的方法是使用using-statement,最后调用Dispose(即使在例外的情况下)。所以它类似于Try/Catch/FinallyConnection.Dispose也会隐式关闭它。

作为一条经验法则:使用using-statement来实现IDisposable(如上面的SqlCeCommand)。

要回答你的问题实际:

会有任何改善记忆,如果我X(或StockRoster)将 使用IDispose类,无法将资源获取在每个循环的结束 默认配置?

什么是改善记忆IDisposable是一个接口,你可以调用处理,甚至上课的时候没有实现IDisposable接近。这只是一个暗示,它可能使用非托管资源,应尽快处理。

+0

感谢您的信息。 – surpavan 2012-07-25 20:40:56