我有一个基类,当从中继承的任何类将GUID添加到另一个单例类的列表中时。我希望在基类中有一个方法,当继承的类完成执行时,该方法将从列表中删除GUID。我正在考虑在Dispose方法中调用方法,但不确定这是否是正确的方法,因为我希望方法调用尽快删除GUID,所以我不想等待.NET GC开始它的工作。另外,因为我以前从未实现过Dispose,我可以将IDisposable接口添加到我的基类并创建一个包含GUID删除逻辑的Dispose方法,还是必须在Dispose方法中明确包含其他逻辑?
答案 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从析构函数运行时,它发生在与应用程序主线程不同的线程上。
,此时您无法使用对象引用的任何对象。