对于一般代码,我真的需要处理一个对象吗?我可以在大多数情况下忽略它,或者当你100%确定你不再需要它时总是丢弃一个物体是个好主意吗?
在你完成它的瞬间处理一个物体.一次性对象表示持有CLR本质上不知道的有价值资源的对象.因此,GC也不知道资源,并且无法就何时应该收集一次性对象并因此释放底层资源做出明智的决定.
最终GC会感觉到内存压力并巧合地收集你的物体(仅此而已).如果不以确定的方式处理对象,则完全有可能进入资源不足状态,几乎没有内存压力.
如何实现这一目标的简单示例.让我们将底层资源视为Win32句柄.这些是非常有限的,相当小.您运行一个创建大量Foo对象的操作.Foo对象实现IDisposable并负责创建和处理Win32句柄.它们不是手动释放的,而是通过差异怪癖进入Gen2堆.这个堆很少被释放.随着时间的推移,足够多的Foo实例进入Gen2堆以占用所有可用的句柄.因此,无论使用多少内存,都无法创建新的Foo对象.
实际上,为了释放句柄,在单个操作期间需要分配相当大量的内存以提供足够的压力来释放实例.
如果对象实现了IDisposable,则应在完成后立即将其丢弃.最简单的方法是用一个使用块包围它:
using (SqlCommand cmd = new SqlCommand(conn)) { cmd.ExecuteNonQuery(); }
您应该始终调用Dispose()
任何实现的类型的原因IDisposable
是它通常用于表示该类型获取非托管资源.特别重要的是要尽快释放这些物品.正如其他人所提到的,using
是这样做的首选方式.