关于using语句的理解问题 本帖最后由 ryantj 于 2009-10-18 03:08:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 objReader会自动释放掉。这种理解是对的吗?对conn.Close();conn.Dispose();是不是也可以省略conn.Dispose()一定可以省略。好的模式在Dispose的时候会关闭连接,我相信这里SqlConnectio.Close()也可以省略。 objReader.Dispose();conn.Close();conn.Dispose();这三句都可以省略。 从来没有采用过这种用法,我看PetShop上面也是这样的,可惜看不懂,问下using怎么用啊 using 里面还封装了。try catch 就算是出现异常。也会被释放。 connn.Close()不能省略;conn.Dispose()可以省略,但愚以为还是不要省略为妙,特别是在循环调用这个方法的时候更是省不得,否则的话你会发现你的sqlmangr.exe进程的内存会不断上涨,甚至超过设置的最大值。 jiangqicheng的回答让我又迷糊了为什么你说conn.Close()不能省略,conn.Dispose()可以省略??我的理解是:sqlconnection的close和dispose实际是做的同一件事,唯一的区别是Dispose方法清空了connectionString,即设置为了null。那么能省略conn.Dispose(),当然也就能省略conn.Close()吧?当然,我知道在习惯上我们应该把conn.Close();conn.Dispose();都加上,手工释放一遍。好象如果不手工释放的话,单凭C#提供的垃圾回收。有可能回收不全,产生"野内存"(应该就是你说的sqlmangr.exe进程的内存会不断上涨)。但是这里我想讲的是在语义上按我那样理解有错没? 实际中,我当然不会为了省事而省略的!(希望各位有经验的高手帮助新人加深理解!) 这个其实就是using作为语句使用时,它允许用户定义一个范围,并在此范围末尾自动释放对象。语法如下:using (SqlConnection conn = new SqlConnection()){ //...}上面的大括号就是用户定义的范围,当执行到using末尾时候,conn对象将自动释放掉!~ connn.Close()不能省略; 绝对不能省略。 objReader会自动释放掉。这种理解是对的吗? 对 conn.Close();conn.Dispose();是不是也可以省略 conn.Dispose()一定可以省略。 conn.Dispose();是销毁对象。你把conn定义为全局的话,那么当你conn.Dispose()之后就不能再调用,只能重新new一个,如果是close(),那你可以open()再使用。还有如果你conn.Dispose();conn是一个变量名,存在栈里,只是把付给他的内存指针删除掉(指向一个sqlconnection对象),垃圾回收器看到堆叠sqlconnection对象没有指针指向,那么就会将它判定为垃圾,之后就等着回收。而你conn关闭,reader不一定关闭。如果你追究下去,那么你就把conn设为全局,之后不要释放,调用CommandBehavior.CloseConnection然后再调用一次查询数据库,看看有没异常就知道啦 好像不是销毁对象吧,你conn.Dispose();后只要再重新给connnectionString赋值就可以conn.Open()了。这里我又弄糊涂了,reader没关闭,conn会关闭呢? 学习using 知道一点,又称为作用域吧? Using语句其实就是Try{ Class a = new Class(); //后续操作}Finally{ a.dispose();}1. using是一个语法糖,就是说,编译器在编译的时候会自动给我们加上Try...Finally的形式,并且在finally中执行对象的dispose()方法来释放非托管资源。(楼主可以尝试写个using然后用ILDASM打开看看)2. 要使用using的对象必须实现IDispose接口,因为要调用dispose()方法嘛。3. Using中不要使用嵌套,也就是using(***){using{***}}这样的写法,就像楼主的代码一样。4. close和dispose的区别,如果这个对象在以后还需要使用,那么使用close方法,如果只用这一次,那么使用dispose方法。5. Using和try/catch是无关的,他不会帮助你catch住异常。嗯,我记得的就这些了,想起来再补充。 呵呵 hide1984 说的和我理解的一样哈! 我想问一下,using结束后,这个using块中定义的所有变量都会被释放吧?因为里面的是局部变量 应届生写一个小程序(c#)[论坛灌水机],大家帮忙看下.帮顶者皆有分的啊!! winform连接超时 大哥们,我郁闷了,进来帮帮我! 如何让文本框里显示HTML DataGrid中怎么取消选中 web中如何调用服务期端exe文件 用DataTable如何在DataGrid中实现列求和? process.StartInfo.CreateNoWindow = true对进程的影响 server2003问题! 【请教】【线程池】线程判断????? 如果置顶后,鼠标也浮不到窗体上面会发生什么呢? 请教C#中如何把字符串转换成byte
对conn.Close();conn.Dispose();是不是也可以省略
conn.Dispose()一定可以省略。
好的模式在Dispose的时候会关闭连接,我相信这里SqlConnectio.Close()也可以省略。
conn.Close();
conn.Dispose();这三句都可以省略。
conn.Dispose()可以省略,但愚以为还是不要省略为妙,特别是在循环调用这个方法的时候更是省不得,否则的话你会发现你的sqlmangr.exe进程的内存会不断上涨,甚至超过设置的最大值。
为什么你说conn.Close()不能省略,conn.Dispose()可以省略??我的理解是:
sqlconnection的close和dispose实际是做的同一件事,唯一的区别是Dispose方法清空了connectionString,即设置为了null。
那么能省略conn.Dispose(),当然也就能省略conn.Close()吧?当然,我知道在习惯上我们应该把conn.Close();conn.Dispose();都加上,手工释放一遍。好象如果不手工释放的话,单凭C#提供的垃圾回收。有可能回收不全,产生"野内存"(应该就是你说的sqlmangr.exe进程的内存会不断上涨)。
但是这里我想讲的是在语义上按我那样理解有错没? 实际中,我当然不会为了省事而省略的!
(希望各位有经验的高手帮助新人加深理解!)
语法如下:using (SqlConnection conn = new SqlConnection())
{ //...}上面的大括号就是用户定义的范围,当执行到using末尾时候,conn对象将自动释放掉!~
对 conn.Close();conn.Dispose();是不是也可以省略
conn.Dispose()一定可以省略。 conn.Dispose();是销毁对象。你把conn定义为全局的话,那么当你conn.Dispose()之后就不能再调用,只能重新new一个,如果是close(),那你可以open()再使用。
还有如果你conn.Dispose();conn是一个变量名,存在栈里,只是把付给他的内存指针删除掉(指向一个sqlconnection对象),垃圾回收器看到堆叠sqlconnection对象没有指针指向,那么就会将它判定为垃圾,之后就等着回收。而你conn关闭,reader不一定关闭。
如果你追究下去,那么你就把conn设为全局,之后不要释放,调用CommandBehavior.CloseConnection
然后再调用一次查询数据库,看看有没异常就知道啦
好像不是销毁对象吧,你conn.Dispose();后只要再重新给connnectionString赋值就可以conn.Open()了。这里我又弄糊涂了,reader没关闭,conn会关闭呢?
using 知道一点,又称为作用域吧?
Using语句其实就是
Try
{
Class a = new Class();
//后续操作
}
Finally
{
a.dispose();
}1. using是一个语法糖,就是说,编译器在编译的时候会自动给我们加上Try...Finally的形式,并且在finally中执行对象的dispose()方法来释放非托管资源。(楼主可以尝试写个using然后用ILDASM打开看看)
2. 要使用using的对象必须实现IDispose接口,因为要调用dispose()方法嘛。
3. Using中不要使用嵌套,也就是using(***){using{***}}这样的写法,就像楼主的代码一样。
4. close和dispose的区别,如果这个对象在以后还需要使用,那么使用close方法,如果只用这一次,那么使用dispose方法。
5. Using和try/catch是无关的,他不会帮助你catch住异常。嗯,我记得的就这些了,想起来再补充。