是否有必要使用变量或 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);
}
此属性:
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)
;只读protected
或public
属性Disposed
应指示是否设置了标志。
至于disposing
参数,Dispose(bool)
方法通常只应以值true
调用;标志的有效目的是将签名从Dispose()
更改,从而允许使用相同的名称。 可继承类通常只应具有终结器,如果它们的整个目的都以终结为中心(例如 SafeHandle
(,所以没有理由担心处理Dispose(false)
。
请注意,如果在调用虚拟方法之前没有阻止双重调用,则每个想要受到保护的派生类都必须为此目的定义自己的冗余标志 - 这有点浪费。