When we consider managed code in our application we also have to think about the performance. .NET has its own way of fine tuning things but just by remembering couple of things we can prevent the unnecessary push backs from our end.
One of the biggest concerns is that why Generics? It is strongly typed, it is type safe. Because of this it also reduces unnecessary Boxing and Unboxing which can be memory intensive. Another thing is that because of snippet feature just by typing ~ we can put destructor in our class and if there is nothing in the body of destructor, the natural life cycle of garbage collector may get hampered.
Such tips and tricks are available in MSDN
Writing Faster Managed Code: Know What Things Cost
Writing High-Performance Managed Applications : A Primer
Garbage Collector Basics and Performance Hints
Performance Tips and Tricks in .NET Applications
Hope this will be helpful.