Gostaria de acrescentar que: Chamar GC.Collect () (+ WaitForPendingFinalizers ()) é uma parte da história. Como corretamente mencionado por outros, GC.COllect () é uma coleção não determinística e é deixada ao critério do próprio GC (CLR). Mesmo se você adicionar uma chamada para WaitForPendingFinalizers, ela pode não ser determinística. Pegue o código deste link do msdn e execute o código com a iteração do loop do objeto como 1 ou 2. Você descobrirá o que significa não determinístico (definir um ponto de interrupção no destruidor do objeto). Precisamente, o destruidor não é chamado quando havia apenas 1 (ou 2) objetos remanescentes por Wait .. (). [Citation reqd.]
Se o seu código estiver lidando com recursos não gerenciados (ex: identificadores de arquivo externos), você deve implementar destruidores (ou finalizadores).
Aqui está um exemplo interessante:
Nota : Se você já experimentou o exemplo acima do MSDN, o código a seguir vai limpar o ar.
class Program
{
static void Main(string[] args)
{
SomePublisher publisher = new SomePublisher();
for (int i = 0; i < 10; i++)
{
SomeSubscriber subscriber = new SomeSubscriber(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(SomeSubscriber.Count.ToString());
Console.ReadLine();
}
}
public class SomePublisher
{
public event EventHandler SomeEvent;
}
public class SomeSubscriber
{
public static int Count;
public SomeSubscriber(SomePublisher publisher)
{
publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
}
~SomeSubscriber()
{
SomeSubscriber.Count++;
}
private void publisher_SomeEvent(object sender, EventArgs e)
{
// TODO: something
string stub = "";
}
}
Eu sugiro, primeiro analise qual poderia ser a saída e, em seguida, execute e, em seguida, leia o motivo abaixo:
{O destruidor só é chamado implicitamente quando o programa termina. } Para limpar deterministicamente o objeto, deve-se implementar IDisposable e fazer uma chamada explícita para Dispose (). Essa é a essência! :)