你能解释一下这里发生了什么吗?
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
}
}
答案 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 (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