如果using语句抛出异常,我如何处置IDisposable对象?

时间:2009-07-07 08:38:28

标签: c# exception dispose idisposable

如果IDataReader引发异常,如何在以下代码段中确保ExecuteReader被处置?

using (IDataReader rdr = cmd.ExecuteReader())
{
    // use it
}

我觉得using合成糖不会调用Dispose(因为没有实例可以调用它)。但是,我怎样才能确定通常由实现IDisposable的类分配的稀缺资源将被释放?

4 个答案:

答案 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)。