My recommendations would be:
- Do not rely on
GC.Collect()in any real program code. Just let the GC do its thing. - If you need guarantees about when the destructor (or equivalent) is called, use the dispose pattern and use a
usingstatement or declaration explicitly soDisposegets called as soon as possible.
class DestructorDemo : IDisposable
{
public string Name { get; set; }
public DestructorDemo(string name)
{
Name = name;
Console.WriteLine($"demo object {Name} constructed");
}
public void Dispose()
{
Console.WriteLine($"demo object {Name} disposed");
}
}
using var obj1 = new DestructorDemo("obj1");
using (var obj2 = new DestructorDemo("obj2"))
{
Console.WriteLine("Press key to dispose 'obj2'");
Console.ReadKey();
// obj2 goes out of scope at the end of the block
// this will automatically call `.Dispose()` on it
}
Console.WriteLine("Press key to dispose 'obj1' and exit");
Console.ReadKey();
// obj1 goes out of scope here
Note that this code is just to showcase the using keyword (in relation to IDisposable). If you want to implement the disposable pattern properly you should look at the help article I linked. Such as making sure that Dispose is called even if the object is naturally garbage collected, that is if you forget to use using. (I also didn’t check the validity of the code but it should get the idea across.)



























Nice straw man.