处理已添加到集合中的对象,但该集合仍引用它

时间:2012-08-15 16:02:46

标签: c# memory-leaks dispose using

从legecy系统中读取一些代码。

假设我有一个A类实例,然后将其添加到集合中,然后将其丢弃。

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

为什么?

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

//Other operation against myControlCollcetion

2 个答案:

答案 0 :(得分:4)

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

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

  1. 清理非托管资源后,许多对象基本上无法使用。在这种情况下,只要访问其中一个成员,就会抛出异常。
  2. 该物体可能只是在一个意想不到的庄园中行动,因为它在被处置后被使用。它可能会导致奇怪的异常,或者仅仅是方法的错误结果,或者实际上是什么。
  3. 实际上可能永远不会有非托管资源。有些对象实现IDisposable只是为了使它们更具可扩展性,或者尝试对它们进行面向未来的验证。 DataTable就是一个例子;它的Dispose什么也没做。在这种情况下,对象在处理后会正常工作。
  4. 即使没有非托管资源,对象仍然可以使用。在调用Dispose之后,可能只有一部分功能变得无法使用,在这种情况下,只要稍后只使用那些有限的方面就可以正常工作。
  5. 某些对象在处理后可能会重新创建它的非托管资源。这将是不好的做法,但是你的班级可以做你想做的事。

答案 1 :(得分:2)

你是对的,没有理由这样做,即使有,这也是错误的代码,非常令人困惑。

开发人员可能打算在Dispose(..)上明确地UserControlA致电(出于某种原因。例如,在标有//some operation的代码部分中可能会执行一些分配非托管资源的函数,并尝试这样做,以避免添加额外的try/catch序列(using自动处理)。

但我重申这是不是一个好的代码。