Исключение конструктора подкласса оставляет экземпляр родительского класса - PullRequest
0 голосов
/ 23 ноября 2010

Извините за большое количество кода для чтения.Это самый простой способ показать проблему.

using System;
using System.Collections.Generic;

namespace P1
{
    class A
    {
        static Dictionary<int, A> a = new Dictionary<int, A>();
        static int i = 0;

        int id;
        public A()
        {
            id = ++i;
            a[id] = this;
        }

        public static int Count() { return a.Count; }
    }

    class B : A
    {
        public B()
        {
            throw new Exception();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var b = new B();
            }
            catch
            {
               // What should be here ????
            }

            Console.WriteLine(A.Count()); //prints 1 - not good
            Console.ReadKey();
        }
    }
}

Кто-нибудь может предложить логику очистки для случая, когда конструктор подкласса терпит неудачу?

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Вам нужно будет поместить логику очистки в конструктор B, поскольку у вас не будет доступа к ссылке на экземпляр после сбоя конструктора.

Вот пример того, как вы можете это сделать:

class A
{
    static Dictionary<int, A> a = new Dictionary<int, A>();
    static int i = 0;

    int id;
    public A()
    {
        id = ++i;
        a[id] = this;
    }

    protected void Destroy()
    {
        a.Remove(id);
        i--;
    }

    public static int Count() { return a.Count; }
}

class B : A
{
    public B() 
    {
        try
        {
            throw new Exception();
        }
        catch (Exception)
        {
            Destroy();
            throw;
        }
    }
}
0 голосов
/ 23 ноября 2010

Ваш конструктор базового класса вызывается до того, как сгенерировано исключение, поэтому объект уже создан и назначен на его место в a. Если вы хотите, чтобы объект не создавался конструктором, вы можете рассмотреть статический метод для создания нового A вместо использования конструктора по умолчанию. Затем, когда не удается создать экземпляр объекта (в B), вы выбросите исключение до того, как объект будет добавлен в словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...