The general advice on when you need a finalizer is: almost never. See Eric Lippert's response to the following question:
When should I create a destructor?
Whether your application will have leaks depends upon many things. However, if you have no unmanaged resources, and you are good about Dispose'ing classes that should be disposed, then you shouldn't have leaks.
On your comment above about running into an issue where a finalizer ran on an object that wasn't fully constructed: this is part of the reason why finalizers can be a dangerous thing. Writing a correct finalizer is a very difficult thing. If you really have resources that must always be cleaned up, you should be using a SafeHandle:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle(v=vs.110).aspx