当我在实施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);
}
答案 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)
;只读protected
或public
属性Disposed
应指明该标志是否已设置。
对于disposing
参数,Dispose(bool)
方法通常只应使用值true
调用;标志的有效目的是从Dispose()
更改签名,从而允许使用相同的名称。可继承类通常只有终结器,如果它们的整个目的都围绕着最终化(例如SafeHandle
),那么就没有理由担心处理Dispose(false)
。
请注意,如果在调用虚方法之前没有阻止双重调用,那么每个想要保护的派生类都必须为此目的定义自己的冗余标志 - 有点浪费。