如何判断是否配置了IDisposable对象引用?

问题描述 投票:80回答:8

是否有方法或其他轻量级方法来检查引用是否属于被处置对象?

附: - 这只是一种好奇心(睡得好,不在生产代码中)。是的,我知道我可以在试图访问该对象的成员时捕获qazxsw poi。

c# .net dispose idisposable
8个回答
-16
投票

这取决于,有ObjectDisposedException对象允许调用IDisposable方法尽可能多,并有Dispose对象,投掷IDisposable。在这种情况下,这些对象必须跟踪状态(通常使用私有布尔字段ObjectDisposedException实现)。


44
投票

否 - IDisposable模式的默认实现不支持它


38
投票

isDisposedSystem.Windows.Forms.Control财产,是IsDisposed。在您自己的IDisposable对象中,您可以轻松创建类似的属性。


18
投票

内置任何东西都不会允许这样做。您需要公开反映内部置位标志的IsDisposed布尔属性。

set to true after Dispose() is called

9
投票

如果它不是你的类并且它没有提供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字段作为属性公开并检查它。


2
投票

canonical IDisposable implementation方法需要执行在放弃对象之前需要进行的任何清理;如果不需要清理,则不需要做任何事情。要求一个物体跟踪它是否已被处置,即使Dispose方法否则什么都不做,将需要许多Dispose对象添加标志以获得非常有限的好处。

如果IDisposable包含两个属性 - 一个指示对象是否需要处理,其中一个指示对象没有通过处置而变得无用,则可能有用。对于处理实际上做某事的对象,这两个值最初都是真的,并且在IDisposable之后会变为假。对于处理不需要进行任何清理的对象,第一种方法总是返回false而第二种方法总是为真,而不必在任何地方存储标志。我不认为现在有任何方法可以添加到.NET中。


1
投票

我觉得这很旧了,但我没有看到答案。有些并非像DataSet这样的所有一次性对象都有可以附加的已处理事件。

Dispose

-1
投票

我喜欢做的是声明对象而不初始化它们,但是将它们的默认值设置为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
© www.soinside.com 2019 - 2024. All rights reserved.