Я имею дело с приложением формы окна С#, и мне нужно запустить деструктор класса сразу после уничтожения моего объекта.
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() снова и снова.
Спасибо за любую помощь.
В моем классе я создаю временную папку, и когда я хочу уничтожить свой объект, я хочу удалить эту папку автоматически, а не сборщиком мусора и не вызывая метод, просто уничтожив объект. Если нет никакого способа, я делаю это, вызывая метод. Спасибо за ваше время.
Обычное решение для детерминированной очистки — реализовать IDisposable
и обернуть использование вашего класса в using(...)
утверждениях.
Их не называют деструкторами, потому что это не одно и то же. К сожалению, у них одинаковый синтаксис, но дело в том, что в C# нет ничего, что вело бы себя как деструкторы. Ближайшая вещь — это IDisposable
, которую можно использовать для выполнения того, о чем вы просите.
Начинающим с другого языка программирования следует внимательно изучить парадигму программирования на основе сборщика мусора и привыкнуть к соответствующим терминам, таким как «финализатор». Чем больше вы придерживаетесь старого стиля, такого как «деструктор», тем дальше вы от правильного пути. В связанной ветке Эрик Липперт оставил важные подсказки о том, чем отличаются финализаторы, которые вы можете иметь в виду.
@BrianRasmussen Честно говоря, они на самом деле были : «Финализаторы (исторически называемые деструкторами) используются для ...» (выделено мной)
@Fildor конечно, но, по крайней мере, они изменили имя, пытаясь уменьшить путаницу. Было плохой идеей заимствовать имя и синтаксис, когда поведение совершенно другое.
@BrianRasmussen Абсолютно согласен.
В 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();
}
}
}
Если вам нужно вызвать метод на ваших условиях, вам нужно управлять этим. Финализаторы специально «используются для выполнения любой необходимой окончательной очистки, когда сборщик мусора собирает экземпляр класса». learn.microsoft.com/en-us/dotnet/csharp/programming-guide/… - финализатор для сборщика мусора, а не для вас, и это не меняется. Почему вы думаете, что вам нужно это сделать, вероятно, есть альтернативное лучшее решение основной проблемы.