0

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

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
    }
}
4

6 回答 6

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();
}
于 2012-04-27T20:30:22.997 回答
1

是的,ds将在您样品的最后一个末端支架处进行处理。是的,ds在您构建时可用dt。原因dtnull简单,ds.Tables[0]就是返回 null。从文档中,该null值意味着DataTable您正在寻找的不存在。我的猜测是DataSet没有填充值。有关示例,请参阅文档。

于 2012-04-27T20:32:03.090 回答
0

using()语句接受 anyIDisposableDispose()在它的范围通过异常或正常执行退出时调用它。

因此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.

有关详细信息,请参阅有关 Using 语句的 MSDN 部分

于 2012-04-27T20:29:39.103 回答
0

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

于 2012-04-27T20:30:15.653 回答
0

这里的使用语句

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

相当于:

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

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

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

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

于 2012-04-27T20:30:48.657 回答
0

像这样想:

using resource

您的resource遗嘱将住在这里,所有其他“使用”声明或其他方法的孩子都可以使用

end of using

所以对你的问题:

ds将在第一个using区块的末尾处理

dt将获得第一个DataTable发现ds并将在其自己的using块的末尾进行处理

发生这种情况是因为using这种形式的语句将始终调用Dispose它所管理的资源的方法,因此,您只能将using块用于实现的类型IDisposable

于 2012-04-27T20:31:35.857 回答