Garbage Collector and Destructors
От: Roter  
Дата: 28.06.07 13:44
Оценка: :))) :))
Добрый день уважаемые девелоперы!

Есть проблема с деструкторами и освобождением ресурсов.
Сборе мусор при закрытии програмы инициирует вызов деструкторов в непонятном (и неподходящем для меня) порядке. Тоесть, коллектор вызывает деструктор для тех обектов, на которые ещё живы референсы. Внизу маленький пример.

Существует множество класов Class1, Class2 и Class3. Class1 включает Class2 и Class2 включает Class3.Сначала вызывается деструктор для Class3, потом Class2 а потом уже для Class1, что не есть хорошо і не логично, потому что на обєкты Class2 и Class3 существуют референсы. В деструкторе Class1 будет сгенерировано исключение NullReference, потомучто, он вызовет MethodName() обекта m_Class2 у которого был уже вызван деструктор и поле m_FieldName ровно null.

Как обеснить такую ситуацию? Можно ли заставить GC роботать в правильном порядке (сначала Class1, потом Class2 и потом Class3) ?

public class Class1
    {
        private Class2 m_Class2;
        public Class1() {
            m_Class2 = new Class2();
        }
        public void MethodName() {
            m_Class2.MethodName();
        }
        ~Class1() {
            m_Class2.MethodName();
            m_Class2 = null;
        }
    }
    public class Class2
    {
        private Class3 m_FieldName = new Class3();
        public Class2() {
        }
        public void MethodName() {
            m_FieldName.Field = 9;
        }
        ~Class2() {
            m_FieldName = null;
        }
    }
    public class Class3
    {
        public int Field;
        public Class3() {
        }
        ~Class3() {
            Field = 8;
        }
    }



Я юзаю C# и .NET 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.