请考虑以下代码:
1-...
2-{
3-...
4-SqlConnection cn=new SqlConnection();
5-...
6-}
如果程序到达第6号陈述cn
将被处置?如果不是cn
变量发生了什么?
答案 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
方法,该方法将关闭数据库连接。
在处理完对象后,它最终会被垃圾收集器收集。
请注意,没有保证该对象将在任何特定时间内完成,甚至最终 。
因此,如果您不处理连接对象,则发生的两件主要事情是:
答案 3 :(得分:1)
你应该使用一个Using语句,但结果将是相同的,它将被标记为一次性使用,GC将在下次运行时收集它。
答案 4 :(得分:0)
No Kerezo,
1-...
2-{
3-...
4-SqlConnection cn=new SqlConnection();
5-...
6-}
我们编译器到达Statement cn对象没有被销毁。你不能访问" cn"对象离开了循环。
如果使用“使用”块,则对象将自动处理。