如果IDataReader
引发异常,如何在以下代码段中确保ExecuteReader
被处置?
using (IDataReader rdr = cmd.ExecuteReader())
{
// use it
}
我觉得using
合成糖不会调用Dispose(因为没有实例可以调用它)。但是,我怎样才能确定通常由实现IDisposable的类分配的稀缺资源将被释放?
答案 0 :(得分:14)
如果在您的示例中,ExecuteReader抛出异常,则它永远不会返回任何内容。然后由ExecuteReader实现,以处理在异常之前创建的任何内容。
答案 1 :(得分:3)
如果对象的构造函数无法运行,那么您没有需要处理的对象。
如果您正在编写可能引发异常的构造函数,那么最好确保使用using
或try-catch块清理所需的任何内容。
在您的IDataReader示例中,如果cmd.ExecuteReader()
方法调用失败,只需处理命令对象就足够了。
答案 2 :(得分:0)
如何将在构造函数外部执行初始化的代码移动到单独的函数中。从本质上讲,你将拥有
using (var tc = new TestClass())
{
tc.Initialize(); // setup the object. acquire expensive resources here, etc.
..more code ..
}
答案 3 :(得分:-2)
我认为using语句被翻译成IL,类似于:
try
{
}
finally
{
disposableUsedObject.Dispose();
}
所以,我认为在正常情况下,应该调用Dispose?
此外,您不应该在构造函数中抛出异常,因为用户不会期望在实例化对象时会抛出异常。 我会移动初始化逻辑,它可以将异常抛给另一个在实例化对象后必须调用的方法(Initialize)。