关于using自动调用dispose释放资源的问题

对using的疑问,创建dataset的时候最好是用using(DataSetds=newDataSet())这样的方式可以在结束时自动调用dispose释放资源,但我这... 对using的疑问,创建dataset的时候最好是用using (DataSet ds = new DataSet())这样的方式可以在结束时自动调用dispose释放资源,但我这个dataset是要返回给其它调用这个方法的地方使用的,那么这个方法里的new dataset的地方还有必要写成using了吗?(请看以下这段)
public DataSet getDataSet(string sqlStatement, string connectionString)
{
try
{
using (SqlConnection cnn = new SqlConnection(connectionString))
{
cnn.Open();

SqlCommand cmd = new SqlCommand();

cmd.Connection = cnn;
cmd.CommandText = sqlStatement;
cmd.CommandTimeout = 360;
SqlDataAdapter da = new SqlDataAdapter(cmd);

using (DataSet ds = new DataSet()) //这里还有必要放在using里吗?有无必要请说明原因
{
da.Fill(ds);
return ds;
}
}
}
catch (Exception Ex)
{
throw Ex;
}
}
展开
 我来答
makosharp
2014-11-02 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:270万
展开全部
  单就你的代码而言,是完全不需要的,原因是写了和没写作用一样。
  首先你要知道GC垃圾回收的基本原理。它并不是一个成员超出作用域就立即回收的,而是根据策略自己决定什么时候自动回收,回收谁,怎么回收。
  当然GC也会负责非托管资源的回收,关于托管资源和非托管资源这里就不做过多介绍了,只是要先指出,各种文件、流、连接这些使用了外部静态资源的类型都是非托管资源,其在垃圾回收上的最大特点是*无法由GC自动回收*,因为GC不知道该不该回收它(默认都是不收回的),必须你告诉GC“要回收”才行。告诉了还不算,这个对象还必须实现自己实现IDispose接口,否则GC不知道该怎样回收。要么就请自己手动销毁,不麻烦GC了。
  与之对比的是托管资源。托管资源是由GC管理的,GC会在特定的条件下对其占用的内存进行销毁。简单点说,释放非托管资源其实很简单,你可以不管它,只要它出了作用域而且没人再引用,GC会标记它等待下次回收时销毁。

  再来说Using块。其实Using块的本质是try.catch.finally,在finally中向GC指示了它下次回收此对象时应使用对象的默认的销毁方法。对于非托管资源,使用Using块在语法上比其他方式更为直接,所以我们会推荐对于各种Connection对象使用此形式处理,一来严格限制了其作用域,二来告诉GC它应该在合适的时候回收此非托管资源。而对于托管资源如int、dataset,使用Using块在释放资源方面毫无帮助,而为了限制作用域使用Using也并不理想,因为GC不会在超出Using的花括号就立刻回收资源,它有自己的逻辑,所以说给托管资源写Using块就好比是:你家明明有一个有自己工作安排的保洁员,你这大老板非要自己倒垃圾,而且没把垃圾倒进垃圾车,偏偏是放在自家门口。

  最后一个问题。在Using块中使用return是有它的意义的,它只做了一件有意义的事:提前告诉GC这个对象失去所有引用后需要销毁。当然,如上所述,只对非托管有意义。
  顺便再提一句,如果一个DataSet ds.DataTable=dt;这就是对dt的一种引用,哪怕dt出了作用域,只要ds不死,dt指向的内存内容一辈子都在。所以当使用Using块的时候,最好不要将Using的对象引用送给别人,尤其是“外部”的人;另一方面讲,当别人阅读你的代码时,会很明确的知道,这个对象只在这一个块中使用,不会送出去导致半天销不掉。

  关于楼上的回答,我只能表示用不用Using块和对象耗多少资源半点关系都没有。
阳光的雷咩咩
2014-10-28 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7856万
展开全部
谁说最好那样?对于SqlConnection最好用using,对DataSet却最好不要。
更多追问追答
追问
谢谢回复,能说下DataSet最好不要的原因吗?
追答
SqlConnection要及时回收的原因是数据库连接是相当消耗资源的对象,如果你创建了很多SqlConnection又不回收则数据库有可能奔溃无法访问。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Sxzy灬丨小柒
2014-11-05 · TA获得超过623个赞
知道小有建树答主
回答量:1223
采纳率:50%
帮助的人:280万
展开全部
我懂你的意思了. 一种是行内,一种是全局using.
它俩又什么优缺点我暂时也不清楚.
不过如果每行都这么写.任何一个系统类都这么写的话
-----累手.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式