析构函数限制-从析构函数访问托管成员

阿隆

在C#析构函数(Finalizer)中您不能访问类的托管成员是正确的吗?如果是真的,为什么呢?您还知道其他哪些C#终结器限制?

例子:

class MyClass
{
    private FileStream _fs;
    private IntPtr _handle;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~MyClass()
    {
        Dispose(false);
    }

    private void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            _fs.Dispose(); // Won't be accessed from destructor
        }

        //some way to release '_handle' - this happans anyway (Called by Dispose or by Destructor)
    }
}
克里斯·曼特尔

是的,您不应从终结器或终结Dispose器调用该方法时访问其他托管类在执行对象的终结器时,它一旦被引用的任何托管对象的状态都是不确定的。它们可能仍然存在,可能自己正在等待定稿,或者可能已经被垃圾回收了。此外,终结器在不同的线程上运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章