使用多个using语句来处理DataSet和DataTables

时间:2012-04-27 20:23:45

标签: c# dataset disposing

你能解释一下这里发生了什么吗?

using(DataSet ds = GetDataSet()) // will this get disposed? if yes (when?)
{
    using(DataTable dt = ds.Tables[0]) /* in this line is ds available for dt? i found some issue with this kind of statement. dt gets null after this line */
    {
          // i know that ds is available here.
          //some code
    }
}

6 个答案:

答案 0 :(得分:1)

using(DataSet ds = GetDataSet()){

  using(DataTable dt = ds.Tables[0])
  // dt will be NULL if there are no tables in ds
  {
    // both dt & ds will be available here

  }// dt will get disposed

}// ds will be disposed at this point...

这个的等效代码是:

try{
 DataSet ds = GetDataSet();
 try{
  DataTable dt = ds.Tables[0];
  // dt will not be null if there are any tables in ds
  // Both ds & dt available here...
 }
 finally{
  dt.Dispose();
 }
}
finally{
 ds.Dispose();
}

答案 1 :(得分:1)

是的,ds将在样本的最后一个括号处理。是的,ds在您构建dt时可用。 dt作为null传出的原因必须只是ds.Tables[0]返回null。从documentation开始,null值表示您要查找的DataTable不存在。我的猜测是DataSet没有充满价值。请参阅an example的文档。

答案 2 :(得分:0)

using()语句接受任何IDisposable语句,并在异常或正常执行退出作用域时调用Dispose()

因此,当dt通过内部关闭}时,ds将首先处理,然后当外部关闭'}`通过时,using(DataSet ds = GetDataSet()) { using(DataTable dt = ds.Tables[0]) { .... } // <-- dt disposed here or if unhandled exception thrown } // <-- ds disposed here or if unhandled exception thrown. 将被处理:

{{1}}

有关详细信息,请参阅MSDN section on the Using statement

答案 3 :(得分:0)

是的,它会在你离开相应的支架后被处理掉。使用调用dispose,它只能与实现IDisposable的对象一起使用。

答案 4 :(得分:0)

此处using statment

using (ResourceType resource = expression) { ... }

相当于:

ResourceType resource = expression;
try {
    ...
}
finally {
   if (resource != null) ((IDisposable)resource).Dispose();
}

(如果ResourceType是值类型,则将省略空检查。)

因此,在您的情况下,第一次使用是有意义的,假设GetDataSet()创建一个新的数据集,以后没有其他人会使用。第二个using没有多大意义 - 据我所知,你不需要处理数据集表。

您获得空dt的原因可能是Tables集合中没有任何内容。

答案 5 :(得分:0)

这样想:

using resource

您的resource将住在这里,并且“使用”语句或其他方法将对所有其他孩子开放

end of using

所以你的问题:

ds将在第一个using

的末尾处理

dt将获得DataTable中找到的第一个ds,并将在其using块的末尾处理

这是因为using语句在此表单中将始终调用其管理的资源的Dispose方法,因此,您只能将using块用于实现的类型IDisposable