gpt4 book ai didi

c# - Dispose 一个对象被添加到集合中,但集合仍然引用它

转载 作者:行者123 更新时间:2023-12-03 20:57:54 24 4
gpt4 key购买 nike

从遗留系统中读取一些代码。

假设我有一个类 A 的实例,然后将它添加到一个集合中,然后处理它。

我只是不明白在这里使用隐式处理有什么意义,因为代码仍然使用 myControlCollcetion,这意味着无论如何都不会真正释放 cltCheckBoxA。

为什么?

using (UserControlA cltCheckBoxA = new UserControlA())
{
//some operation
base.myControlCollcetion.Add(cltCheckBoxA);
}

//Other operation against myControlCollcetion

最佳答案

处置一个对象与释放它的托管内存(这是 GC 所做的)完全不同。 Dispose 显式清理垃圾收集器无法释放的所有非托管资源。

这意味着当在对象上调用 Dispose 之后使用该对象时,有很多可能性。 (这不是一个详尽的列表。)

  1. 许多对象在其非托管资源被清理后基本上无法使用。在这种情况下,他们通常会在访问其中一个成员时抛出异常。
  2. 该对象可能会以意想不到的方式运行,因为它在被释放后仍在使用。它可能会导致奇怪的异常,或者只是方法的不正确结果,或者,实际上,任何事情。
  3. 它实际上可能从来没有非托管资源。一些对象实现 IDisposable 只是为了使它们更具可扩展性,或者尝试使其面向 future 。 DataTable 就是一个例子;它的 Dispose 什么都不做。在这种情况下,该对象在处置后将正常工作。
  4. 即使没有非托管资源,该对象也可能仍然可用。调用 Dispose 后,可能只有一部分功能无法使用,在这种情况下,只要稍后仅使用那些有限的方面,它就可以正常工作。
  5. 某些对象在处理后访问时可能会重新创建它的非托管资源。这是不好的做法,但这是你的类(class),你可以为所欲为。

关于c# - Dispose 一个对象被添加到集合中,但集合仍然引用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972841/

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