Extension methods enable you to "add" methods to existing types
without creating a new derived type, recompiling, or otherwise modifying
the original type. Extension methods are a special kind of static
method, but they are called as if they were instance methods on the
extended type. For client code written in C# and Visual Basic, there is
no apparent difference between calling an extension method and the
methods that are actually defined in a type.
The most common extension methods are the LINQ standard query operators that add query functionality to the existing System.Collections.IEnumerable and System.Collections.Generic.IEnumerable types. To use the standard query operators, first bring them into scope with a using System.Linq directive. Then any type that implements IEnumerable(Of T) appears to have instance methods such as GroupBy, OrderBy, Average,
and so on. You can see these additional methods in IntelliSense
statement completion when you type "dot" after an instance of an IEnumerable(Of T) type such as List(Of T) or Array.
The following example shows how to call the standard query operator OrderBy
method on an array of integers. The expression in parentheses is a
lambda expression. Many standard query operators take lambda expressions
as parameters, but this is not a requirement for extension methods.
class ExtensionMethods2 { static void Main() { int[] ints = { 10, 45, 15, 39, 21, 26 }; var result = ints.OrderBy(g => g); foreach (var i in result) { System.Console.Write(i + " "); } } } //Output: 10 15 21 26 39 45
Extension methods are defined as static methods but are called by
using instance method syntax. Their first parameter specifies which type
the method operates on, and the parameter is preceded by the this modifier. Extension methods are only in scope when you explicitly import the namespace into your source code with a using directive.
The following example shows an extension method defined for the System.String class. Note that it is defined inside a non-nested, non-generic static class:
namespace ExtensionMethods { public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }
The WordCount extension method can be brought into scope with this
using directive:
using ExtensionMethods;
string s = "Hello Extension Methods"; int i = s.WordCount();
In your code you invoke the extension method with instance method
syntax. However, the intermediate language (IL) generated by the
compiler translates your code into a call on the static method.
Therefore, the principle of encapsulation is not really being
violated. In fact, extension methods cannot access private variables
in the type they are extending.