Когда мой деструктор вызван в этих обстоятельствах? (С #) - PullRequest
6 голосов
/ 11 августа 2009

Мне было интересно, когда деструктор вызывается при этих обстоятельствах и будет ли он вызываться в основном потоке пользовательского интерфейса?

Допустим, у меня есть следующий код, когда будет вызван деструктор, и будет ли он ждать, пока я завершу все свои вызовы функций?

private void Foo()
  {
  MyObject myObj = new MyObject();
  DoSomeFunThingsWithMyObject(myObj);

  myObj = new MyObject(); //is the destructor for the first instance called now?
  DoLongOminousFunctionality(myObj);  
  }
  //Or will it be called after the DoLongOminousFunctionality?

Это просто то, что меня интересует, если поток прерывается при myObj = new MyObject (), или если вызов Destructor ожидает, пока поток не освободится.

Спасибо за информацию.

Ответы [ 5 ]

17 голосов
/ 11 августа 2009

Деструктор будет вызван, когда сборщик мусора решит, что ему нужно очистить некоторые старые объекты. Вы не можете полагаться на время выполнения деструкторов в .NET

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

См. Реализация метода утилизации

3 голосов
/ 11 августа 2009

Если важно, чтобы жизненный цикл ваших объектов управлялся, наследуйте от IDisposible, и вы можете использовать , используя ключевое слово .

2 голосов
/ 11 августа 2009

Деструкторы (или финализаторы - некоторые люди предпочитают их называть) запускаются в отдельном потоке. Они запускаются в определенное время. Они не гарантированно будут работать до конца жизни ваших приложений, и даже в этом случае возможно, что их не вызовут.

2 голосов
/ 11 августа 2009

Деструкторы или финализаторы, как их еще называют, вызываются в определенный момент времени после того, как ваш экземпляр станет доступен для сборки мусора. Это не происходит в детерминированный момент времени, как в C ++.

1 голос
/ 11 августа 2009

Деструктор (финализатор) будет вызван, когда сборщик мусора сможет определить, что ваш объект больше не используется. Финализаторы запускаются в потоке финализаторов, одновременно для вашей основной программы!

При правильной оптимизации (JIT-компилятор может легко устранить локальную переменную), это может произойти уже внутри first DoSomeFunThingsWithMyObject (когда этот метод не нужен его параметр больше), или в любое более позднее время. Возможно, он даже не вызывается, пока ваша программа не будет закрыта (а в редких случаях финализатор никогда не вызывается ).

...