有很多博客,SO 问题告诉你如何知道对象是否已经被处置。例如。使用某些类可用的 IsDisposed
属性。
我想知道:
- 假设
IsDisposed
返回true
,如果对象已经被释放,我们怎么可以调用它的IsDisposed
属性? - 如果我们可以访问它的属性,我们怎么能说这个对象已经死了、被扔掉了或被处置了呢? (你不是通过调用它的属性来引用它吗?!)
更新#1:
在回答了几个问题后,我提出了后续问题,指出“Disposed
并不意味着对象已死;它只是意味着它持有的任何未管理的资源都被释放了。”:
- 这是否意味着
Disposed
并不是说this
对象已被处置? - 如果
Disposed
对象本身没有死,为什么我们会得到ObjectDisposedException
? (不是说这个对象不能再用了吗?)
最佳答案
“Disposed”只是表示已调用“IDisposable.Dispose”的简写。这通常(但不限于)用于表示它已释放它可能持有的任何非托管资源。
它与垃圾回收无关,并不意味着该对象“死了”或“被扔掉了”。
更新
Does that mean that Disposed is not saying that this object is disposed?
不,这意味着它已被处置,即它已释放其非托管资源。
If the Disposed object itself is not dead, why do we get ObjectDisposedException ? (Does not it mean that this object cannot be used any longer? )
由每种类型决定何时抛出 ObjectDisposedException
。但通常它会在您尝试访问需要已释放的非托管资源的成员时抛出。在释放对象后,每个 成员访问都抛出 ObjectDisposedException
通常是不正确的。
举一个简单的例子,如果你有一个被释放的FileStream
(即文件被关闭):
尝试调用
ReadByte
将抛出ObjectDisposedException
,因为您无法从未打开的文件中读取数据。但是您仍然可以访问
Name
属性,该属性提供传递给FileStream
构造函数的名称,并且不需要访问非托管的资源(底层文件)。
关于c# - IsDisposed 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512274/