I am confused about dispose. I am trying to get my code disposing resources correctly. So I have been setting up my classes as IDisposable
(with a Dispose
method) them making sure that the Dispose
method gets called.
But now FXCop is telling me lots of stuff about disposing = false
and calling Dispose(false)
.
I don't see a Dispose
method that takes a bool. Do I need to make one? If so, why? Why not just have a method that gets called when it is disposing?
I saw some code here: CA1063: Implement IDisposable correctly - Microsoft Docs that shows how to make a Dispose
method that takes a bool
. It says it is for native vs managed resourses. But I thought the whole point of dispose was for unmanaged resourses only.
Also, the line that FXCop is complaining about is this:
~OwnerDrawnPanel() { _font.Dispose(); }
It says:
CA1063 : Microsoft.Design : Modify 'OwnerDrawnPanel.~OwnerDrawnPanel()' so that it calls Dispose(false) and then returns.
But Font
does not have a Dispose(bool)
on it (that I can find).
Why do I need a Dispose(bool)
? and if I do, why doesn't Font have it? and since it does not have it, why is FXCop asking me to use it?
Thanks for all the great answers. I think I understand now. Here is
Disposing of "unmanaged" resources falls into two categories:
Bitmap
, Font
etc), but still need Dispose
to be called to clean them up properly.Dispose(bool)
is used to tell the difference between the two:
Dispose
is directly called on your object, you want to free both kinds of "unmanaged" resources.In the context of C#, dispose is an object method invoked to execute code required for memory cleanup and release and reset unmanaged resources, such as file handles and database connections.
Dispose() will not be called automatically. If there is a finalizer it will be called automatically. Implementing IDisposable provides a way for users of your class to release resources early, instead of waiting for the garbage collector.
There is a simple guideline: if you have finished with an object whose type implements IDisposable then call Dispose() on it; you should use a using block to do this.
Destructors Versus DisposeIt is not legal to call a destructor explicitly. Your destructor will be called by the garbage collector. If you do handle precious unmanaged resources (such as file handles) that you want to close and dispose of as quickly as possible, you ought to implement the IDisposable interface.
Dispose(bool)
is a pattern to implement Finalize
and Dispose
to Clean Up Unmanaged Resources , see this for detail
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With