相关疑难解决方法(0)

正确使用IDisposable接口

我从阅读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在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?

.net c# garbage-collection idisposable

1586
推荐指数
12
解决办法
31万
查看次数

什么是C++中的"哨兵对象"?

回答这个问题,并Potatoswatter 回答过的

现代C++等价物将是一个哨兵对象:在函数的开头构造它,其构造函数实现call(),并在返回(或异常退出)时,它的析构函数实现

我不熟悉在C++中使用sentry对象.我认为它们仅限于输入和输出流.

有人可以向我解释C++哨兵对象以及如何将它们用作类中一个或多个方法的周围拦截器吗?

即如何做到这一点?

Sentry对象确实非常相似.一方面,它们需要显式实例化(并且通过它),但另一方面,您可以添加它们,这样它们不仅可以检查类的不变量,还可以检查手头函数的一些前/后条件.

c++ idioms

14
推荐指数
1
解决办法
3962
查看次数

在C#中实现RAII

我有一个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"指令.

有没有办法:

  1. 在对象超出范围时触发析构函数或某些函数,或者
  2. 防止SuppressEvents对象完全在"using"指令之外进行初始化

c# raii

8
推荐指数
2
解决办法
7024
查看次数

标签 统计

c# ×2

.net ×1

c++ ×1

garbage-collection ×1

idioms ×1

idisposable ×1

raii ×1