Добрый день уважаемые девелоперы!
Есть проблема с деструкторами и освобождением ресурсов.
Сборе мусор при закрытии програмы инициирует вызов деструкторов в непонятном (и неподходящем для меня) порядке. Тоесть, коллектор вызывает деструктор для тех обектов, на которые ещё живы референсы. Внизу маленький пример.
Существует множество класов 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