Laat ik beginnen met een simpel voorbeeld:
public static class Int32Extensions
{
public static Int32 DoubleValue(this Int32 value)
{
return value * 2;
}
}
Bovenstaande code verdubbeld de waarde welke de integer op dat moment heeft.
int a = 45;
int b = a.DoubleValue();
Console.WriteLine("Inhoud van b: {0}", b.ToString());
Op de console zal de de tekst 'Inhoud van b: 90' verschijnen. Maar wat is er nu precies gebeurt? Hoofdverantwoordlijke in 'this' bij het eerste argument van de functie. Zoals bekend vertegenwoordigd this een instantie van een object (class/structure). De compiler haalt daarna ee klein tovertrukje uit. De compiler veranderd namelijk regel 2 naar:
int b = Int32Extentions.DoubleValue(a);Nu zul je je vast afvragen of extensions dan een nieuw soort overervings systeem is. Nou nee. Een extension is geen onderdeel van de class waaraan deze wordt verbonden. Daardoor kun je met een extension ook geen protected of private fields benaderen.
Waarom zul je dan extensions uberhaupt maken? Ik denk dat elke programmeur wel utility of helper classes heetf geschreven. De functies welke je normale in helper classes zou plaatsen, kunnen nu dus direct aan een object worden gekoppeld. In de meeste gevallen werd het object al als eerste argument aan de functie meegegeven en het enigste wat je hoeft te doen is het keyword 'this' ervoor zetten.
Zitten er dan ook nadelen aan extensions?Ja, zelfs een hele grote. Het gebruik van extensions kan de code erg vertroebelen. Je roept in je code een propertie of functie aan van een object welke deze eigenlijk niet kent. code zoals 45.DoubleValue(); kan daarom moeilijk te bevatten zijn.