В следующем коде:Будет вызван деструктор класса C#, если класс содержит статические поля?
public sealed class Switch
{
public static MyObj s_object = new MyObj();
private readonly SomeObject m_object = new SomeObject();
~Switch()
{
m_object?.Dispose();
}
}
public class Test()
{
Test()
{
Switch switch = new Switch();
switch = null;
...
}
}
Когда тест выполняется т е р, новый объект переключатель создано затем сразу же установить нулевое значение. В какой-то момент GC избавится от него, вызвав деструктор ~Switch()
. Но это произойдет, когда класс содержит статическое поле, например s_object
, и вызывающее приложение не завершилось (домен приложения все еще загружен)? Статические объекты сохраняются для срока службы приложения; означает ли это, что нестатический класс, содержащий его, тоже будет?
Я не знаю, относится ли это к вашей ситуации, но в целом вы должны реализовать 'IDisposable' самостоятельно для очистки ресурсов и использовать деструктор, если есть неуправляемый материал для очистки. –
@ C.Evenhuis C# даже не имеет деструкторов, у него есть финализаторы, которые выполняют совсем другую работу – Mgetz
@ C.Evenhuis Учитывая, что мы можем видеть определение финализатора, мы можем фактически видеть, что нет неуправляемого ресурса, и поэтому не должно быть финализатора, скорее, он должен реализовать 'IDisposalbe'. – Servy