2017-01-26 3 views
0

В следующем коде:Будет вызван деструктор класса 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, и вызывающее приложение не завершилось (домен приложения все еще загружен)? Статические объекты сохраняются для срока службы приложения; означает ли это, что нестатический класс, содержащий его, тоже будет?

+0

Я не знаю, относится ли это к вашей ситуации, но в целом вы должны реализовать 'IDisposable' самостоятельно для очистки ресурсов и использовать деструктор, если есть неуправляемый материал для очистки. –

+1

@ C.Evenhuis C# даже не имеет деструкторов, у него есть финализаторы, которые выполняют совсем другую работу – Mgetz

+0

@ C.Evenhuis Учитывая, что мы можем видеть определение финализатора, мы можем фактически видеть, что нет неуправляемого ресурса, и поэтому не должно быть финализатора, скорее, он должен реализовать 'IDisposalbe'. – Servy

ответ

3

Это не должно быть проблемой. Статические поля не связаны таким образом с экземпляром определяющего типа в терминах представления памяти.

Проверить этот пост для получения более подробной информации: How exactly do static fields work internally?

2

Наличие статических полей никак не влияет на момент времени, когда объект будет мусора (и, следовательно, завершена). Экземпляр будет окончательно доработан в момент, сравнимый со временем, когда это происходит без статического поля.

Единственное воздействие, которое статические поля оказывают на экземпляры, заключается в том, что статическая инициализация происходит до создания первого экземпляра, что потенциально делает создание первого экземпляра медленнее, чем остальное.

Примечание: код в сообщении показывает недопустимую реализацию финализатора, поскольку он относится к другому управляемому объекту и пытается вызвать метод на нем. Это приводит к неопределенному поведению для обоих случаев (с/без статического поля).

+0

Вопрос в том, будет ли класс размещаться, когда он содержит статический контент, а не столько о сроках (что подразумевает, что это может быть). –

+0

@DiskCrasher Я думаю, что я неправильно прочитал ваш вопрос - я прочитал его: «' 'Switch()' finalizer будет вызываться в разное время (или вообще), если есть статическое поле », и ответил, что, указав, что статические поля не изменит время вызова этого финализатора (следовательно, если вызов происходит без статического поля, это произойдет в сопоставимое время, когда в классе есть статическое поле). Но ваш реальный вопрос, по-видимому, касается фактического распоряжения - чем на основе кода в публикации, размещенной в 'm_object', будет неопределенным в обоих случаях (как состояние, если другие объекты не определены в финализаторе) –

Смежные вопросы