#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
Комментариев нет:
Отправить комментарий