在类exit上强制执行方法调用

时间:2011-10-31 13:43:05

标签: c# dispose

我有一个基类,当从中继承的任何类将GUID添加到另一个单例类的列表中时。我希望在基类中有一个方法,当继承的类完成执行时,该方法将从列表中删除GUID。我正在考虑在Dispose方法中调用方法,但不确定这是否是正确的方法,因为我希望方法调用尽快删除GUID,所以我不想等待.NET GC开始它的工作。另外,因为我以前从未实现过Dispose,我可以将IDisposable接口添加到我的基类并创建一个包含GUID删除逻辑的Dispose方法,还是必须在Dispose方法中明确包含其他逻辑?

2 个答案:

答案 0 :(得分:0)

实际上,你正在混合东西。

垃圾收集器永远不会在您的班级上调用Dispose。您应该实现IDisposable,以便客户端可以确保始终调用清理方法:

using System;

class BaseClass : IDisposable {
    bool _guidremoved = false;
    public void RemoveGuid() {
        if (!_guidremoved) {
            _guidremoved = true;
            // your logic here                
        }
    }
    public void Dispose() {
        RemoveGuid();
    }
}

class Derived : BaseClass { 
}

static class Program {
    static void Main(string[] args) {
        using (Derived d = new Derived()) { 
            // do stuff here...

            // call RemoveGuid explicitly, if needed
            d.RemoveGuid();
        } // when we exit this block, Dispose is called
    }
}

在此示例中,如果未到达using的行,则RemoveGuid块可确保Dispose()方法调用d.RemoveGuid()方法。

相反,垃圾收集器会在运行时调用类上的析构函数(或更好的Finalize方法),但这可能不适合在您的情况下删除GUID。< / p>

查看Implementing Finalize and Dispose to Clean Up Unmanaged Resources了解详情。

答案 1 :(得分:0)

编写Dispose方法没有神奇之处。它与任何其他方法没有什么不同。如果您不打电话,系统将不会为您执行此操作。

除了:

如果您确实希望确保正确清理这些宝贵的资源,那么即使没有以通常的方式调用Dispose方法,您还需要为GC到达对象时的情况构建一些安全措施。

这样做的方法是从对象析构函数中调用它,当你这样做时,需要注意一些事项。首先,当Dispose从析构函数运行时,它发生在与应用程序主线程不同的线程上。

,此时您无法使用对象引用的任何对象。