4

IDataReader如果ExecuteReader抛出异常,我如何确保在以下代码段中被处理?

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

对我来说,合成糖不调用 Dispose 是有道理的using(因为没有实例可以调用它)。但是,我如何确定通常由实现 IDisposable 的类分配的稀缺资源将被释放?

4

4 回答 4

14

如果在您的示例中 ExecuteReader 引发异常,则它永远不会返回任何内容。然后由 ExecuteReader 的实现来处理在异常之前创建的任何内容。

于 2009-07-07T08:40:07.747 回答
3

如果对象的构造函数无法运行,则您没有需要处置的对象。

如果您正在编写一个可能引发异常的构造函数,您最好确保通过 usingusing或 try-catch 块清理您需要的任何内容。

在您的 IDataReader 示例中,如果cmd.ExecuteReader()方法调用失败,只需处理命令对象就足够了。

于 2009-07-07T08:42:44.920 回答
0

如何将在构造函数之外进行初始化的代码移动到单独的函数中。本质上,您将拥有

using (var tc = new TestClass())
{
    tc.Initialize();  // setup the object. acquire expensive resources here, etc.

    ..more code ..
}
于 2009-07-07T08:49:31.113 回答
-2

我认为 using 语句被翻译成类似于以下内容的 IL:

try
{
}
finally
{
    disposableUsedObject.Dispose();
}

所以,我认为在正常情况下,应该调用 Dispose ?

此外,您不应该在构造函数中抛出异常,因为用户不会期望在实例化对象时会抛出异常。我会将可能引发异常的初始化逻辑移到另一个必须在实例化对象后调用的方法(Initialize)。

于 2009-07-07T08:40:00.307 回答