我读到,如果我的类具有本身是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/

10-12 03:54