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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严鹏 黑马帝   /  2012-2-13 20:03  /  4681 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在ADO.Net中,using与close(),dispose()分别是怎样实现释放内存的,他们的使用与达到的效果有什么不同?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

11 个回复

倒序浏览
close(),dispose()的区别:close()之后,在需要的时候还可以再open(),而dispose()之后就释放了内存中的数据,在需要的时候只能重新连接了再用。

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
王彬 + 1
宋天琪 + 1

查看全部评分

回复 使用道具 举报
using 会自动帮我们dispose ,dispose内部会判断相关链接是否关闭,如套接字,数据流,数据连接等,
close 只是把各种连接关闭,对象本生还存在,
dispose 是直接把对象销毁了
一个比喻就像从水龙头用水管来浇水,close只是吧水龙头关了,dispose是把水管都拔了

评分

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

查看全部评分

回复 使用道具 举报
建议下一本  你必须知道的.NET PDF看看!上面写的都是关于底层的东西!讲的非常好!全面讲解关系内存这块的问题!
多看几遍~很有帮助的!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
一个比喻就像从水龙头用水管来浇水,close只是吧水龙头关了,dispose是把水管都拔了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
using在花括号结束时内部会自动帮我们dispose掉连接;close只是把打开的连接给关闭,还可以再次代开(即open),而dispose则直接把对象给销毁掉了,不能在直接open了,若要open还得重新创建连接

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
严海彬 发表于 2012-2-17 10:43
using 会自动帮我们dispose ,dispose内部会判断相关链接是否关闭,如套接字,数据流,数据连接等,
close  ...

即使 是dispose 了,sqlconnection的对象还是不会被销毁的,只是清空了连接字符串,所以再次open就不行了,如果再重新给连接字符串赋值了,还是可以open的,但是sqlconnection对象还是存在的,

这是我看到网上的一些解释,
回复 使用道具 举报
close:关闭之后还能打开。
dispose:直接销毁,不能再次使用,
using 再出了作用域以后调用dispose。
e-g:
string str = "server...........";
SqlConnection conn = new  SqlConnection(str);
{
    conn.Open();
      ....
     conn.close();//还能再打开
   conn.Open();
     ....
    conn.close();
    conn.Dispose();//直接销毁
   
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
close () 是关闭 ,关闭之后再以再open() ,而dispose()是销毁,dispose()之后不可以再open()

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
using在大括号结束时会自动调用dispose(),dispose()调用前会自动检查是否close(),若否,则先调用close();close()只是把对应对象的相关属性关闭,还可以再次打开(即open()),而dispose()则直接把对应对象销毁,不能在直接open()了,若要open()还得重新创建对象

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
close()是关闭,也就是说,我们这个所创立的对象连接仍然在内存上并没有消失,而dispose 则是销毁,即:在内存上已经消失,不能够再用了
我们经常在VS连接数据库中会看到 conn.dispose(); 意味着当前你所创立且引用的对象链接已经销毁。下面的代码将无法使用链接
回复 使用道具 举报
connectiong是一条通往数据库的路,close()相当于在路上设置-路障,(dispose()方法是把路拆了,不能再open())dispose()是对实现Idispose非托管资源的释放,在调dispose方法的时候,它会自动的去判断数据库有没有关闭,如果没有就调用close()方法关闭,然后再调dispose()释放资源!using是出了大括号就调用dispose的方法
,这样避免程序员忘记,在msdn很多都是用这种方法,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马