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

时间:2013-09-24 14:32:26

标签: c# variables properties interface idisposable

当我在实施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);
    }

2 个答案:

答案 0 :(得分:2)

此属性:

bool disposed { get; set; }

几乎相当于一个字段。实际上是这样的:

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

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

另请注意,如果您可以密封您的课程(因此您不必担心想要覆盖Disposing(bool)的子类,您可以完全摆脱Dispose(bool)方法,只需实现{{ 1}}以一种简单的方式。

实际上,除非你需要保留一个标志,指示实例是否已被处理,你也可以删除它。

答案 1 :(得分:0)

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

对于disposing参数,Dispose(bool)方法通常只应使用值true调用;标志的有效目的是从Dispose()更改签名,从而允许使用相同的名称。可继承类通常只有终结器,如果它们的整个目的都围绕着最终化(例如SafeHandle),那么就没有理由担心处理Dispose(false)

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