In a class with managed and unmanaged C# with Example
resources It's important to let finalization ignore managed resources. The finalizer runs on another thread -- it's possible that the managed objects don't exist anymore by the time the finalizer runs. Implementing a protected Dispose(bool) method is a common practice to ensure managed resources do not have their Dispose method called from a finalizer. public class ManagedAndUnmanagedObject : IDisposable { private SqlConnection sqlConnection = new SqlConnection(); private UnmanagedHandle unmanagedHandle = Win32.SomeUnmanagedResource(); private bool disposed; public void Dispose() { Dispose(true); // client called dispose GC.SuppressFinalize(this); // tell the GC to not execute the Finalizer } protected virtual void Dispose(bool disposeManaged) { if (!disposed) { if (disposeManaged) { if (sqlConnection != null) { sqlConnection.Dispose(); } } unmanagedHandle.Release(); disposed = true; } } ~ManagedAndUnmanagedObject() { Dispose(false); } }