【问题标题】:what happens after I dispose an object?处置对象后会发生什么?
【发布时间】:2014-04-19 08:08:09
【问题描述】:

我的Form 上有一个Label。当我调用Dispose() 方法时,对象从Form 中删除。但我仍然可以设置它的属性。在我为对象调用 Dispose() 方法后会发生什么。我可以恢复它并再次显示它吗?

public void MyMethod()
{
     label1.Dispose();
     label1.Text = "Test";
     //No error happens
}

处理后我可以读取一些属性,例如 Left 属性。这意味着标签仍然存在于某处。我怎样才能完全删除它?

【问题讨论】:

  • 互联网上有很多文章很好地解释了这个话题。谷歌搜索有多难?
  • 当你调用对象的Dispose方法时,对象的Dispose方法被执行。这只是一种常规的旧方法,在大多数情况下是实现IDisposable.Dispose。该方法唯一的特殊之处在于,如果您使用 using 块中的对象,它会自动调用。

标签: c# dispose


【解决方案1】:

在这种情况下,控件的句柄被销毁(并因此从其父级中删除)。处置后,无法再将其添加到可见显示中。但是,与类实例一样,对象本身仍然存在,因此可以设置大多数属性。 (有的会给出objectdisposed异常,比如试图获取Handle属性)

一般来说,哪些属性仍然可以设置,取决于对象的实现(IDispose 接口的),以及它检查它是否被释放的位置。

【讨论】:

  • 还有一件事要添加。它与用户界面无关。它是通用的“Dispose”模式。
  • 处理后我可以读取一些属性,如左属性。这意味着标签钢存在于某处。我怎样才能完全删除它?
  • 对于要从内存中释放的对象,它必须可用于垃圾收集。为此,首先必须删除所有对它的引用。所以这里的第 1 步将在处理后设置: label1 = null;处理是一个单独的步骤,因为这会立即释放句柄。引用被销毁后,对象实例本身可用于垃圾回收。如果要强制立即进行垃圾回收,可以调用 GC.Collect(),但通常系统会为您执行此操作。
【解决方案2】:

obj.Dispose() 命令 GC 销毁该对象。如果您尝试在obj.Dispose() 之后更改其数据,则不会发生任何事情。

【讨论】:

  • 这不是真的。 IDisposable 是任意处置。
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 2012-09-18
  • 1970-01-01
  • 2015-09-06
  • 2014-05-31
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多