如果程序到达块的结尾,则将对象Dispose

时间:2012-06-17 10:18:57

标签: c# .net c#-4.0

请考虑以下代码:

1-...
2-{
  3-...
  4-SqlConnection cn=new SqlConnection();
  5-... 
6-}

如果程序到达第6号陈述cn将被处置?如果不是cn变量发生了什么?

5 个答案:

答案 0 :(得分:5)

  

如果程序达到第6号陈述将被处置?

没有

  

如果不是cn变量发生了什么?

这取决于你之后是否使用它。如果您不使用它并且它超出范围,这意味着它有资格进行垃圾收集。当这个垃圾收集发生时,你无法控制。但是当它发生时,将调用析构函数,它本身调用Dispose方法。

这就是说正确的方法是始终将IDisposable资源包装在using语句中。这可确保始终调用Dispose方法,即使抛出异常:

2-{
  3-...
  4-using (SqlConnection cn=new SqlConnection())
    {
        ...
    }
    5-... 
6-}

答案 1 :(得分:2)

不,当GarbageCollector决定销毁它时,它会被处理掉。

如果您要处置它,请使用using语句(SqlConnection实现IDisposeable):

using(SqlConnection cn = new SqlConnection())
{
    // code
}

答案 2 :(得分:2)

不,当变量超出范围时,不会处理该对象。

当对象不再使用时(在作用域内的某个地方,在使用该变量的最后一行之后),该对象将用于垃圾收集。

下一次垃圾收集器运行时,它会发现该对象不再被使用,但它也会发现它有一个Finalize方法,而且它没有被处理,所以对象将是添加到终结队列中。此外,由于未收集对象,因此可能会将其移至下一个堆生成,这实际上是将对象从内存中的一个位置移动到另一个位置。

垃圾收集器有一个特殊的线程,用于终结终结队列中的对象,最终确定对象。对象的Finalize方法将调用Dispose方法,该方法将关闭数据库连接。

在处理完对象后,它最终会被垃圾收集器收集。

请注意,没有保证该对象将在任何特定时间内完成,甚至最终

因此,如果您不处理连接对象,则发生的两件主要事情是:

  • 您无法控制何时关闭连接。
  • 完成一个对象比直接调用Dispose要贵得多。

答案 3 :(得分:1)

你应该使用一个Using语句,但结果将是相同的,它将被标记为一次性使用,GC将在下次运行时收集它。

答案 4 :(得分:0)

No Kerezo,

1-... 
2-{ 
  3-... 
  4-SqlConnection cn=new SqlConnection(); 
  5-...  
6-} 

我们编译器到达Statement cn对象没有被销毁。你不能访问" cn"对象离开了循环。

如果使用“使用”块,则对象将自动处理。