Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Почему поток выходит из деструктора, содержащего бесконечный цикл

#c# #sof



Почему приложение завершает свою работу? Ведь в деструкторе должно быть зацикливание:

namespace Core
{
    class Test
    {
        ~Test() { while (true); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
        }
    }
}

    


Ответы

Ответ 1



Потому что в 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

Комментариев нет:

Отправить комментарий