您的位置:首页 > 其它

close和dispose的区别

2016-05-05 19:26 218 查看

MSDN中的解释

SqlConnection.Close方法

关闭与数据库之间的连接。

Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。

如果 SqlConnection 超出范围,则不会将其关闭。 因此,必须通过调用Close或Dispose显式关闭该连接。 Close 和 Dispose 的功能等效。 如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。 另一方面,如果 Pooling 设置为 false 或 no,则会关闭到服务器的基础连接。

Component.Dispose方法

释放有Component使用的所有资源

使用完 Component 后调用 Dispose。 Dispose 方法使 Component 处于不可用状态。调用完 Dispose 后,必须释放对 Component 的所有引用,这样垃圾回收器才能收回 Component 占用的内存。

Garbage Collection

垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

实践代码

string connStr = @"server=.;database=MyFirstDB;uid=sa;pwd=157326;";
Stopwatch sp = new Stopwatch();
sp.Start();

for (int i = 0; i < 1000000; i++)
{
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
//conn.Close();//00:00:08.3134626
//conn.Dispose();//00:00:08.7635818
}

sp.Stop();
Console.WriteLine(sp.Elapsed);
Console.ReadKey();


第一次使用close,第二次使用dispose。两者执行时间基本相同。

推论

msdn只说dispose会撤销所有对SqlConnection对象的所有引用,并没有说dispose要销毁SqlConnection对象。即只是告诉GC可以销毁他了。

至于什么时候销毁SqlConnection对象,那是GC的事儿了。并且msdn说垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。是最佳时间并不是立即销毁。

close只是关闭了与数据库之间的连接,并没有撤销对SqlConnection对象的引用,所以close后还可以open。而dispose就不可以。

由此得出的结论是不管是dispose还是close都不会销毁对象,即不会释放内存,它们都会把sqlconnection对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是connection timeout设置的时间内,如果程序中没有向连接池发出请求说要connection对象,sqlconnection对象便会销毁,这也是连接池存在的意义。

在查阅资料和多方认证探讨后,基本是这么个结论,如有不同见解,还请多多指教。

PS:stream中的dispose和close是相同的。

参考资料:dispose()与close()的区别 - 凡心不凡 - 博客园
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: