在部署时将类保存到磁盘:我的代码是否有错误?

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)

Ree*_*sey 6

这可能会奏效 - 但我不会这样做.通过这样做,您可能会在终结线程中执行潜在危险的代码.如果出现任何问题,你的状况会很糟糕......

处置应该只是处理你的资源.我强烈建议将其移至另一个方法,并使其成为对象API的一部分,而不是依赖IDisposable来处理您的处理.


Gre*_*ech 5

几乎不可能正确地编写终结器,并且在一个中完成这种工作只是一个灾难的处方.更不用说它会破坏性能并且无法调试.终结者的规则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)