close和dispose的区别

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()的区别 - 凡心不凡 - 博客园

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值