是否有方法或其他轻量级方法来检查引用是否属于被处置对象?
附: - 这只是一种好奇心(睡得好,不在生产代码中)。是的,我知道我可以在试图访问该对象的成员时捕获qazxsw poi。
这取决于,有ObjectDisposedException
对象允许调用IDisposable
方法尽可能多,并有Dispose
对象,投掷IDisposable
。在这种情况下,这些对象必须跟踪状态(通常使用私有布尔字段ObjectDisposedException
实现)。
否 - IDisposable模式的默认实现不支持它
isDisposed
有System.Windows.Forms.Control
财产,是IsDisposed
。在您自己的IDisposable对象中,您可以轻松创建类似的属性。
内置任何东西都不会允许这样做。您需要公开反映内部置位标志的IsDisposed布尔属性。
set to true after Dispose()
is called
如果它不是你的类并且它没有提供IsDisposed属性(或类似的东西 - 名称只是一个约定),那么你无法知道。
但是如果它是你的类并且你跟随public class SimpleCleanup : IDisposable
{
private bool disposed = false;
public bool IsDisposed
{
get
{
return disposed;
}
}
public SimpleCleanup()
{
this.handle = /*...*/;
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// free only managed resources here
}
// free unmanaged resources here
disposed = true;
}
}
public void Dispose()
{
Dispose(true);
}
}
,那么只需将_disposed或_isDisposed字段作为属性公开并检查它。
canonical IDisposable implementation方法需要执行在放弃对象之前需要进行的任何清理;如果不需要清理,则不需要做任何事情。要求一个物体跟踪它是否已被处置,即使Dispose
方法否则什么都不做,将需要许多Dispose
对象添加标志以获得非常有限的好处。
如果IDisposable
包含两个属性 - 一个指示对象是否需要处理,其中一个指示对象没有通过处置而变得无用,则可能有用。对于处理实际上做某事的对象,这两个值最初都是真的,并且在IDisposable
之后会变为假。对于处理不需要进行任何清理的对象,第一种方法总是返回false而第二种方法总是为真,而不必在任何地方存储标志。我不认为现在有任何方法可以添加到.NET中。
我觉得这很旧了,但我没有看到答案。有些并非像DataSet这样的所有一次性对象都有可以附加的已处理事件。
Dispose
我喜欢做的是声明对象而不初始化它们,但是将它们的默认值设置为class DisposeSample : IDisposable
{
DataSet myDataSet = new DataSet();
private bool _isDisposed;
public DisposeSample()
{
// attach dispose event for myDataSet
myDataSet.Disposed += MyDataSet_Disposed;
}
private void MyDataSet_Disposed(object sender, EventArgs e)
{
//Event triggers when myDataSet is disposed
_isDisposed = true; // set private bool variable as true
}
public void Dispose()
{
if (!_isDisposed) // only dispose if has not been disposed;
myDataSet?.Dispose(); // only dispose if myDataSet is not null;
}
}
。然后,在循环结束时,我写道:
Nothing
这是一个完整的示例:
If anObject IsNot Nothing Then anObject.Dispose()
这也适用于将主要对象放在例程的顶部,在Public Sub Example()
Dim inputPdf As PdfReader = Nothing, inputDoc As Document = Nothing, outputWriter As PdfWriter = Nothing
'code goes here that may or may not end up using all three objects,
' such as when I see that there aren't enough pages in the pdf once I open
' the pdfreader and then abort by jumping to my cleanup routine using a goto ..
GoodExit:
If inputPdf IsNot Nothing Then inputPdf.Dispose()
If inputDoc IsNot Nothing Then inputDoc.Dispose()
If outputWriter IsNot Nothing Then outputWriter.Dispose()
End Sub
例程中使用它们,然后将它们放在Try
块中:
Finally