gpt4 book ai didi

c# - IsDisposed 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-30 00:41:28 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com