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

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

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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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();
        }
    }
}

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