Use custom exceptions to add information that will be more meaningful to your users when exceptions occur. And, you still can maintain all the information from the original exception.
Articles Written by Jay Miller
Use some of the language's lesser known features for safe type casting and comparison.
Handling exceptions can sometimes be a little tricky. If you are not careful, your code may act on the wrong information. Learn how to bubble up exceptions while keeping the original exception information intact.
Here is encapsulation, one of the very basic tenets of object-oriented programming. Using properties instead of public variables helps insulate the users of your class from change, provides you more flexibility, and will ease maintenance of your class.
Are you tired of hard-coding function names in trace messages? Have you ever used cut and paste to copy a trace statement and forgot to change the function name? There'll be no more wild goose chases because of bad function names when you determine the function name dynamically.
Be a good resource citizen by implementing IDisposable. You will be able to ensure that your objects have the opportunity to release all of their managed and unmanaged resources.