Как программно заставить С# немедленно запускать «деструкторы»?

Я имею дело с приложением формы окна С#, и мне нужно запустить деструктор класса сразу после уничтожения моего объекта.

using System;
namespace Test
{
    class TTTest
    {
        public TTTest()
        {
            Console.WriteLine("Constructor Called");
        }

        ~TTTest()
        {
            Console.WriteLine("Destroyed called");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            TTTest obj1 = new TTTest();
            TTTest obj2 = new TTTest();
            obj1 = null;
            obj2 = null;
            Console.ReadKey();
        }
    }
}

Если я запущу этот код... Результат будет:

Constructor Called
Constructor Called

И не будет:

Constructor Called
Constructor Called
Destroyed called
Destroyed called

Я хочу заставить компилятор запускать сборщик мусора, и я могу сделать это:

GC.Collect

Но я хочу запускать деструктор каждого класса сразу после уничтожения каждого объекта без автоматического вызова GC.Collect() в моих подпрограммах.

Там в любом случае ?

Мне нужен хороший способ уничтожить любые вещи сразу после уничтожения моего объекта и не повторять GC.Collect() снова и снова.

Спасибо за любую помощь.

Если вам нужно вызвать метод на ваших условиях, вам нужно управлять этим. Финализаторы специально «используются для выполнения любой необходимой окончательной очистки, когда сборщик мусора собирает экземпляр класса». learn.microsoft.com/en-us/dotnet/csharp/programming-guide/… - финализатор для сборщика мусора, а не для вас, и это не меняется. Почему вы думаете, что вам нужно это сделать, вероятно, есть альтернативное лучшее решение основной проблемы.

moreON 14.02.2023 07:05

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

Mohsen Ilkhani 14.02.2023 07:10

Обычное решение для детерминированной очистки — реализовать IDisposable и обернуть использование вашего класса в using(...) утверждениях.

Klaus Gütter 14.02.2023 07:31

Их не называют деструкторами, потому что это не одно и то же. К сожалению, у них одинаковый синтаксис, но дело в том, что в C# нет ничего, что вело бы себя как деструкторы. Ближайшая вещь — это IDisposable, которую можно использовать для выполнения того, о чем вы просите.

Brian Rasmussen 14.02.2023 07:39

Начинающим с другого языка программирования следует внимательно изучить парадигму программирования на основе сборщика мусора и привыкнуть к соответствующим терминам, таким как «финализатор». Чем больше вы придерживаетесь старого стиля, такого как «деструктор», тем дальше вы от правильного пути. В связанной ветке Эрик Липперт оставил важные подсказки о том, чем отличаются финализаторы, которые вы можете иметь в виду.

Lex Li 14.02.2023 07:41

@BrianRasmussen Честно говоря, они на самом деле были : «Финализаторы (исторически называемые деструкторами) используются для ...» (выделено мной)

Fildor 14.02.2023 08:40

@Fildor конечно, но, по крайней мере, они изменили имя, пытаясь уменьшить путаницу. Было плохой идеей заимствовать имя и синтаксис, когда поведение совершенно другое.

Brian Rasmussen 14.02.2023 09:51

@BrianRasmussen Абсолютно согласен.

Fildor 14.02.2023 09:56
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
1
8
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В C# вы бы реализовали такую ​​механику с помощью Dispose().

class TTTest : IDisposable
{
    public TTTest()
    {
        Console.WriteLine("Constructor Called");
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose called");
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (TTTest obj1 = new TTTest())
        using (TTTest obj2 = new TTTest())
        {
            Console.ReadKey();
        }
    }
}

Другие вопросы по теме