c# - IsDisposed 是如何工作的?

标签 c# .net garbage-collection clr idisposable

有很多博客,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/

相关文章:

c# - System.Collections.Queue<T>、线程、锁定和同步

c# - 如何简化同一开放通用实现的大量封闭通用版本的注册?

java - JDBC 中关闭 ResultSet 后的内存/堆状态

c# - 创建 Windows 窗体 打开新窗体

c# - 如何将应用程序设置导出到可移植文件中? [C#]

c# - Selenium - 下拉框查询

c# - 内存堆安全 : String garbage collection

c# - MonoTouch NSClassFromString

java - GC 在 BitmapFactory.decodeStream() 上过于活跃

garbage-collection - CDI 应用程序和从属范围会合谋影响垃圾收集吗?