Please can anyone recommend a quick checklist / best practice guide to help us avoid simple (but subtle) mistakes that cause could cause memory leaks in .net apps
I find
Memory leaks can come from a variety of sources.
You registered an event but forgot to unregister that event.
Files/connections were opened but not closed properly.
The Dispose() call was not implemented properly.
The Dispose() call was bypassed somehow; for example, an exception was encountered in between.
You encountered a deadlock (which may result in not releasing root objects).
The finalizer thread is blocked; for example, the STA thread for the COM object is not available.
There are leaks from unmanaged code.
An object’s lifetime is too high.
There is a circular reference.
Leaks can come from the .NET Runtime environment (on rare occasions).
Leaks may also appear from your testing framework. (In that case, it is a test leak, not a development environment leak, and test engineers are responsible for resolving it.)