0

当我实现 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);
    }
4

2 回答 2

2

这个性质:

bool disposed { get; set; }

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

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

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

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

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

于 2013-09-24T14:34:58.147 回答
0

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

至于disposing参数,Dispose(bool)方法一般只能用 ; 的值来调用true。该标志的有效目的是从 更改签名Dispose(),从而允许使用相同的名称。可继承类通常只有在它们的全部目的围绕终结(例如SafeHandle)时才应该有终结器,因此没有理由担心处理Dispose(false).

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

于 2013-09-24T19:41:56.397 回答