我读到,如果我的类具有本身是IDisposable的成员变量,则需要实现IDisposable
。好吧,我正在实现IDisposable
接口(interface),因为我的类包含一个IDisposable本身的数据库对象(下面的db
类成员):
public class CommissionModel : IDisposable
{
protected PetaPoco.Database db;
public CommissionModel()
{
string connectionString = "Server=localhost;...";
// The line below may throw an exception (!!!)
db = new PetaPoco.Database(connectionString, "mysql");
}
// Automatically close database connection
public void Dispose()
{
if (db != null)
db.Dispose();
db = null;
}
public void InsertRecord(Record somerecord)
{
// ...
db.Insert(somerecord);
}
问题是
db
成员的实例化在某些情况下可能会失败。当在构造函数中引发异常并且未创建数据库对象时,我该怎么办?我应该重新抛出异常,还是应该检查InsertRecord方法中的
db != null
? 最佳答案
如果构造函数引发异常,则代码的使用者将永远不会收到对类实例的引用。最终将收集部分初始化的类内存,并且不会调用Dispose。
我通常建议将可能由于外部环境(而不是由于滥用,例如无效的参数值)而失败的操作转移到单独的方法(例如“Connect”)上。
关于c# - 实现IDisposable时处理构造函数中的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8526732/