黑马程序员技术交流社区

标题: Dispose()和Close()的区别? [打印本页]

作者: xiaqingchao    时间: 2013-3-11 01:06
标题: Dispose()和Close()的区别?
Disponse()和Close()二者的区别和关系?
作者: 许庭洲    时间: 2013-3-11 06:42
Close以后还可以Open, Dispose以后则不能再用。
作者: 黑马-杨鹏立    时间: 2013-3-11 09:16
Disponse()和Close()二者的区别和关系?
disponse是销毁,close是关闭。。。。
拿数据库连接来举个例子。。。
当你建立数据库连接后,你只是close时,连接并没有销毁,只需要open还能在打开,也就是说并没有释放资源,对于互联网来说,数据库连接是非常宝贵的。。。这样一直占用资源导致数据库压力增大。
而disponse则是销毁,当你关闭数据库连接在调用disponse后,这条连接将不再存在,连接得到释放。。。。
以前我想过一个问题,在调用disponse之前有没有必要先调用close,实验发现,无论是否调用close,只要调用disponse后,会先检查连接是否close,如果没有close则先close掉,在disponse。
作者: 天行    时间: 2013-3-11 09:33
1、SqlConnection类的Close()方法在MSDN中的说明是这样的:关闭与数据库的连接。这是关闭任何打开连接的首选方法。 如果 SqlConnection 超出范围,则不会将其关闭。因此,必须通过调用Close

或 Dispose 显式关闭该连接。Close 和 Dispose 在功能上等效。如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。另一方面,如果 Pooling 设置为 false 或 no,则会关闭

到服务器的基础连接。 也就是说Close()方法和Dispose()方法只是在关闭连接这个功能上等效
2、Close()方法只是关闭了连接,然后这个连接被存储到连接池,所以在调用Close()方法以后,还是可以再通过Open()方法来打开连接的而调用Dispose()方法以后,这个连接就不能在使用了!
3、还有一个重要区别就是,当Close()方法并没有调用GC.SuppressFinalize(this);,这导致的直接后果就是在垃圾回收的时候需要进行终止化操作,这会导致这个实例的“代龄”提升,从而极大的延

迟这个对象的回收时间!针对SqlConnection这个类来说,如果以后还需要使用这个连接可以使用Close()方法临时关闭连接,如果以后不需要使用这个连接了,可以优先选用Dispose()方法来释放资源

,当然你可以使用using关键字来简化这个过程,OleDbConnection类和OdbcConnection类的源代码我没有找到,但是应该和SqlConnection类是类似的!
4、对于FileStream类来说,Close()方法和Dispose()方法是没有区别!










作者: 董华阳    时间: 2013-3-11 12:06
Close 是停业整顿,停业了,可以通过公关,再重开,物还是原来的物;只是关闭而已,没有释放真正的释放资源,可以重新打开;
Dispose 是炸毁,炸毁了,想再开张,就只有重头建起;是把对象销毁,将不再存在;

作者: 黑马-蒋振军    时间: 2013-3-11 15:39
这个貌似以前有人问到过,就比如说对一个connection对象来说,close之后还在连接池中,还可以进行open操作,而Disponse则是直接把连接对象销毁掉,如果想用的话必须再新建
作者: HM张扬    时间: 2013-3-11 17:14
    Close()被设计成public的,并且在Close()里面调用被隐藏的Dispose(); 而后Dispose()再去调用另一个virtual的Dispose(bool)函数。所以如果从这个class继承,你就必须实现Dispose(bool)方法。调用者通过调用Close()就会间接调用到你重载的那个Dispose(bool)方法去释放资源了。
    在.Net Framework里,Close()被设计成public的,并且在Close()里面调用被隐藏的Dispose(); 而后Dispose()再去调用另一个virtual的Dispose(bool)函数。所以如果从这个class继承,你就必须实现Dispose(bool)方法。调用者通过调用Close()就会间接调用到你重载的那个Dispose(bool)方法去释放资源了。
    因为Close()只是用来呼叫那个隐藏的Dispose()继而呼叫Dispose(bool)的,用户不应该改变Close的行为。对于这一点来说,System.IO.Stream是存在设计问题的。原因可能是为了满足向下兼容的需要。所以,我们在MSDN文档里面可以查到:虽然Close()是virtual的,但是不应该被override。   

话说你下边的问题dispose打错了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2