CSharpFan CSharpFan - 2 years ago 110
C# Question

Dispose, when is it called?

Consider the following code:

namespace DisposeTest
{
using System;

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Calling Test");

Test();

Console.WriteLine("Call to Test done");
}

static void Test()
{
DisposeImplementation di = new DisposeImplementation();
}
}

internal class DisposeImplementation : IDisposable
{
~DisposeImplementation()
{
Console.WriteLine("~ in DisposeImplementation instance called");
}
public void Dispose()
{
Console.WriteLine("Dispose in DisposeImplementation instance called");
}
}
}


The Dispose just never get's called, even if I put a wait loop after the
Test();
invocation. So that quite sucks. I want to write a class that is straightforward and very easy to use, to make sure that every possible resource is cleaned up. I don't want to put that responsibilty to the user of my class.

Possible solution: use
using
, or call Dispose myself(basicly the same). Can I force the user to use a using? Or can I force the dispose to be called?

Calling
GC.Collect();
after
Test();
doesn't work either.

Putting
di
to
null
doesn't invoke Dispose either. The Deconstructor DOES work, so the object get's deconstructed when it exits
Test()


Ok guys, it's clear now!

Thank you all for your answers! I will add a warning in the comment!

Answer Source

I want to write a class that is straightforward and very easy to use, to make sure that every possible resource is cleaned up. I don't want to put that responsibilty to the user of my class.

You can't do that. The memory management is simply not built to accomodate clueless developers.

The IDisposable pattern is intended for developers as a way of telling an object when they are done with it, instead of having the memory management trying to figure that out by using things like reference counting.

You can use the Finalizer as a fallback for users who fail to dispose objects properly, but it doesn't work well as the primary method for cleaning up objects. To work smoothly objects should be disposed properly, so that the more costly Finalizer doesn't ever need to be called.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download