In order to release unmanaged resources you need to use or implement the dispose method.
So what is an unmanaged resource? It is simply resources that the CLR does not manage for you. For example: File streams, database connections, P/Invoked api:s.
Msdn gives a rather clear answer.
GC.SuppressFinalizeinside the dispose method. This is to avoid that the finalize method is called for the object.
One reason could be that you’re dealing with a P/Invoked api. Telling the unmanaged code to clean up the resources associated with a particular pointer twice can cause unintended consequences. Using closed handles is a security risks since windows recycles handles. Another reason is performance: A finalize is costly to perform.
In order to simplify the use of operating system handles you can use “Safe Handle”.
Comments or errors? Fork this post and do a pull request on github