2

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

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

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

为什么?

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

//Other operation against myControlCollcetion
4

2 回答 2

4

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

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

  1. 许多对象在它们的非托管资源被清理后基本上就无法使用了。在这种情况下,他们通常会在访问其中一个成员时抛出异常。
  2. 该对象可能只是在一个意想不到的庄园中发挥作用,因为它在被处置后被使用。它可能会导致奇怪的异常,或者只是方法的错误结果,或者实际上是任何事情。
  3. 它可能从未真正拥有过非托管资源。一些对象实现 IDisposable 只是为了使它们更具可扩展性,或者尝试使它们适应未来。 DataTable就是一个例子;它Dispose什么也没做。在这种情况下,对象在处理后将正常工作。
  4. 即使没有非托管资源,该对象也可能仍然可用。可能只有一部分功能在Dispose被调用后变得不可用,在这种情况下,只要以后只使用那些有限的方面,它就可以正常工作。
  5. 某些对象在释放后访问时可能会重新创建它的非托管资源。这将是不好的做法,但这是你的课程,你可以做你想做的事。
于 2012-08-15T16:08:26.870 回答
2

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

开发人员可能打算显式调用(出于某种原因。例如,在标记为的代码部分中Dispose(..)可能会执行一些分配非托管资源的函数),并试图避免添加额外的序列(自动处理)。UserControlA//some operationtry/catchusing

但我再说一遍,这不是一个好的代码。

于 2012-08-15T16:03:42.300 回答