When do you use extension methods, ext. methods vs. inheritance?

This link http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/26/c-extension-methods---to-extend-or-not-to-extend.aspx provides good guidance on when to use Extension methods and when not.

To quote from this article:

A good extension method should:
- Apply to any possible instance of the type it extends.
- Simplify logic and improve readability/maintainability.
- Apply to the most specific type or interface applicable.
- Be isolated in a namespace so that it does not pollute IntelliSense.


Extension methods allow existing classes to be extended without relying on inheritance or having to change the class's source code. This means that if you want to add some methods into the existing String class you can do it quite easily. Here's a couple of rules to consider when deciding on whether or not to use extension methods:

  • Extension methods cannot be used to override existing methods

  • An extension method with the same name and signature as an instance method will not be called

  • The concept of extension methods cannot be applied to fields, properties or events

  • Use extension methods sparingly....overuse can be a bad thing!


Times to use extension methods:

  • when you don't control the types being extended
  • where you don't want to force the implementor to provide code that can be done using the existing methods

For an example of the second point; you might have an extension method on IList<T> (for example, Sort) that can be written entirely using the existing IList<T> members... so why force anybody else to write anything? This is the foundation block of LINQ, and allowed Microsoft to provide much more functionality without breaking anything.

Times to not use extension methods:

  • when polymorphism is critical; you cannot guarantee that your code will be the version that gets executed with an extension method, as methods directly on the type take precedence
  • when you need access to private/protected members

Tags:

C#

.Net