如何在以下代码片段中确保IDataReader
在ExecuteReader
抛出异常时被处理?
using (IDataReader rdr = cmd.ExecuteReader())
{
// use it
}
我认为使用using
语法糖不调用Dispose(因为没有实例可调用它)。然而,我如何确保实现IDisposable接口的类通常分配的稀缺资源将被释放?
如何在以下代码片段中确保IDataReader
在ExecuteReader
抛出异常时被处理?
using (IDataReader rdr = cmd.ExecuteReader())
{
// use it
}
我认为使用using
语法糖不调用Dispose(因为没有实例可调用它)。然而,我如何确保实现IDisposable接口的类通常分配的稀缺资源将被释放?
如果对象的构造函数运行失败,则您不需要处理任何需要被处理的对象。
如果您正在编写可能会抛出异常的构造函数,最好使用using
或try-catch块来清理您需要的任何内容。
在您的IDataReader示例中,如果cmd.ExecuteReader()
方法调用失败,仅需处理命令对象即可。
using (var tc = new TestClass())
{
tc.Initialize(); // setup the object. acquire expensive resources here, etc.
..more code ..
}
我认为using语句被翻译成类似于IL的代码:
try
{
}
finally
{
disposableUsedObject.Dispose();
}
所以,在正常情况下,我认为应该调用Dispose方法?
此外,在构造函数中不应抛出异常,因为用户不会预期在实例化对象时会抛出异常。 我会将可能引发异常的初始化逻辑移动到另一个方法(Initialize)中,在实例化对象后必须调用该方法。