Почему приложение завершает свою работу? Ведь в деструкторе должно быть зацикливание:
namespace Core
{
class Test
{
~Test() { while (true); }
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
}
}
}
Ответ
Потому что в C# деструктор (а точнее, финализатор, так он называется) работает по-другому. Он вызывается не сразу, а когда-нибудь потом, да и то лишь при условии, что сборщик мусора удалит объект. Поскольку запуск сборщика мусора не гарантирован, то и вызов вашего финализатора тоже не гарантирован.
Кроме того, финализаторы бегут в отдельном потоке, а если в конце работы приложения финализация бежит слишком долго, то она насильно обрывается.
В вашем случае программа короткая и не нагружает память, понятно, что сборщик мусора запущен скорее всего не будет.
Для нужной вам семантики гарантированного вызова метода для уничтожения объекта вам нужно реализовать интерфейс IDisposable и воспользоваться конструкцией using
class Test : IDisposable
{
public void Dispose() { while (true) ; }
}
class Program
{
static void Main(string[] args)
{
using (Test test = new Test())
{ }
}
}
Дополнительная информация по теме:
Как и когда нужно имплементировать IDisposable?
Восстановление объектов в C#
When everything you know is wrong, part one и part two
Комментариев нет:
Отправить комментарий