IsDisposed如何真正起作用?

Lea*_*ner 4 .net c# clr garbage-collection idisposable

有很多博客,SO问题告诉你如何知道对象是否已被处置.例如,使用IsDisposed某些类可用的属性.

我想知道:

  • 假设IsDisposed正在返回true,如果对象已被处理,我们怎么可以IsDisposed在其上调用属性?
  • 如果我们可以访问它的属性,我们怎么能说对象已经死亡或丢弃或处置?(你是不是通过调用它的属性来引用它?!)

更新#1:

我在几个答案之后跟进了一些问题,说" Disposed并不意味着对象已经死了;它只是意味着它所持有的任何未经纳入的资源都被释放了.":

  • 这是否意味着Disposed不是说this对象被处置?
  • 如果Disposed对象本身没有死,为什么我们得到ObjectDisposedException?(这不是说这个物体不能再使用了吗?)

Joe*_*Joe 5

"Disposed"只是简称"IDisposable.Dispose".这通常(但不是唯一地)用于表示它已经释放了它可能持有的任何非托管资源.

它与垃圾收集无关,并不意味着对象"死"或"扔掉".

UPDATE

这是否意味着Disposed并不是说这个对象被处理了?

不,这意味着它被处置,即它已经释放了它的非托管资源.

如果Disposed对象本身没有死,为什么我们得到ObjectDisposedException?(这不是说这个物体不能再使用了吗?)

由每个类型决定何时投掷ObjectDisposedException.但是,当您尝试访问需要已释放的非托管资源的成员时,通常会抛出它.在处理对象之后,ObjectDisposedException对于每个成员访问都抛出通常不是真的.

举一个简单的例子,如果你有一个FileStream被处置(即文件被关闭):

  • 例如,试图打电话ReadByte会抛出一个ObjectDisposedException,因为你无法读取未打开的文件.

  • 但您仍然可以访问该Name属性,该属性提供传递给FileStream构造函数的名称,并且不需要访问非托管资源(基础文件).