A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaqingchao 中级黑马   /  2013-3-11 01:06  /  3007 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Disponse()和Close()二者的区别和关系?

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

6 个回复

倒序浏览
Close以后还可以Open, Dispose以后则不能再用。
回复 使用道具 举报
Disponse()和Close()二者的区别和关系?
disponse是销毁,close是关闭。。。。
拿数据库连接来举个例子。。。
当你建立数据库连接后,你只是close时,连接并没有销毁,只需要open还能在打开,也就是说并没有释放资源,对于互联网来说,数据库连接是非常宝贵的。。。这样一直占用资源导致数据库压力增大。
而disponse则是销毁,当你关闭数据库连接在调用disponse后,这条连接将不再存在,连接得到释放。。。。
以前我想过一个问题,在调用disponse之前有没有必要先调用close,实验发现,无论是否调用close,只要调用disponse后,会先检查连接是否close,如果没有close则先close掉,在disponse。
回复 使用道具 举报
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()方法是没有区别!









评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
Close 是停业整顿,停业了,可以通过公关,再重开,物还是原来的物;只是关闭而已,没有释放真正的释放资源,可以重新打开;
Dispose 是炸毁,炸毁了,想再开张,就只有重头建起;是把对象销毁,将不再存在;

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
这个貌似以前有人问到过,就比如说对一个connection对象来说,close之后还在连接池中,还可以进行open操作,而Disponse则是直接把连接对象销毁掉,如果想用的话必须再新建

点评

黑马论坛2013年加分及其惩罚规则请您仔细阅读。未选择技术方向不加分。我等你修改。  发表于 2013-3-11 21:41
回复 使用道具 举报
    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打错了

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马