我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
我回答这个问题,并Potatoswatter 回答过的
现代C++等价物将是一个哨兵对象:在函数的开头构造它,其构造函数实现call(),并在返回(或异常退出)时,它的析构函数实现
我不熟悉在C++中使用sentry对象.我认为它们仅限于输入和输出流.
有人可以向我解释C++哨兵对象以及如何将它们用作类中一个或多个方法的周围拦截器吗?
即如何做到这一点?
Sentry对象确实非常相似.一方面,它们需要显式实例化(并且通过它),但另一方面,您可以添加它们,这样它们不仅可以检查类的不变量,还可以检查手头函数的一些前/后条件.
我有一个InfoPath表单,我需要有条件地禁用它的OnChange事件.由于在表单加载后无法绑定事件处理程序,因此我不得不依赖一个全局计数器来指示是否应该执行OnChange事件.在每个OnChange事件中,我在执行任何操作之前检查SuppressEventsCount == 0.为了在执行某个函数或其他函数期间抑制事件,我只需设置SuppressEventsCount ++,并且 - 当函数退出时再次.这样做的最大问题是它不是例外.所以我有一个好主意将SuppressEvents计数器包装在一个实现iDisposable的类中
using(SuppressEvents s = new SuppressEvents()){
// OnChange events fired here are ignored
} // OnChange events enabled again
Run Code Online (Sandbox Code Playgroud)
这是有效的,但它仍然不如c ++解决方案那么理想,它根本不需要使用"using"指令.
有没有办法: