Bri*_*ian 2 c# destructor idisposable
我正在尝试创建一个简单的类,它在不再使用时将自身序列化为磁盘.我现在的代码(见下文).我现在的代码似乎有用,但我对自己的知识并不完全自信,所以我想知道是否有其他人看到这个代码有任何重大问题.
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, this);
byte[] output = Dostuff(ms);
File.WriteAllBytes(DBPATH, output);
}
this.disposed = true;
}
Run Code Online (Sandbox Code Playgroud)
这可能会奏效 - 但我不会这样做.通过这样做,您可能会在终结线程中执行潜在危险的代码.如果出现任何问题,你的状况会很糟糕......
处置应该只是处理你的资源.我强烈建议将其移至另一个方法,并使其成为对象API的一部分,而不是依赖IDisposable来处理您的处理.
几乎不可能正确地编写终结器,并且在一个中完成这种工作只是一个灾难的处方.更不用说它会破坏性能并且无法调试.终结者的规则1是不要使用它们.规则2(仅限高级用户)不使用它们,除非您确定必须这样做.
如果它只是一个有趣的爱好项目,那么没有真正的伤害,它可能会运作得很好,但如果我在生产代码库中看到这样的东西,我会哭.
如果你确实想要做这样的事情,那么我会使它成为一个显式调用,并且只是在调试期间使用终结器来捕获未调用显式方法的情况,例如
class MyClass
{
private bool dirty; // set this whenever the object changes
~MyClass
{
if (this.dirty)
{
Debug.Fail("Object was not saved.");
}
}
public void Save()
{
if (this.dirty)
{
// TODO: do the save
this.dirty = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)