是否有必要使用变量或 IDisposable 中的属性

本文关键字:IDisposable 属性 变量 是否 | 更新日期: 2023-09-27 18:32:47

当我实现IDisposable接口时,我使用了bool disposed变量,该变量在protected virtual void Dispose(bool disposing)中。

但我想知道,如果我在这种情况下不使用简单的变量,而是使用C#中的属性怎么办?

class A : IDisposable
{
    bool disposed { get; set; }
...
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                //dispose managed ressources
            }
        }
        disposed = true;
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

是否有必要使用变量或 IDisposable 中的属性

此属性:

bool disposed { get; set; }

几乎等同于一个字段。它实际上是这样的:

bool _disposed;
bool disposed { get { return _disposed; } set { _disposed = value; } }

鉴于字段和属性都是私有的,并且您没有向属性添加任何行为,我只会坚持使用一个简单的字段。

还要注意的是,如果你可以密封你的类(所以你不需要担心子类想要覆盖Disposing(bool)你可以完全摆脱Dispose(bool)方法,只需以简单的方式实现Dispose()

实际上,除非您需要保留一个标志来指示实例是否已被释放,否则您也可以将其删除。

目前还不清楚您是在谈论disposed标志还是disposing参数。 如果是前者,我的首选模式是使用 private int 变量,并将IDisposable.Dispose实现Interlocked.Exchange标志为 1,如果它以前为零,则调用 Dispose(bool);只读protectedpublic属性Disposed应指示是否设置了标志。

至于disposing参数,Dispose(bool)方法通常只应以值true调用;标志的有效目的是将签名从Dispose()更改,从而允许使用相同的名称。 可继承类通常只应具有终结器,如果它们的整个目的都以终结为中心(例如 SafeHandle (,所以没有理由担心处理Dispose(false)

请注意,如果在调用虚拟方法之前没有阻止双重调用,则每个想要受到保护的派生类都必须为此目的定义自己的冗余标志 - 这有点浪费。