De komst van extensiemethoden hangt samen met de noodzaak om nieuwe functies toe te voegen aan al bestaande gegevensn types (vooral bibliotheek- en externe types), zonder de originele code van deze types te wijzigen. Dit is vooral relevant in moderne .NET-toepassingen, waar extra gebruiksgemakken nodig zijn maar geen toegang is tot het aanpassen van de oorspronkelijke klassen.
Het probleem bestond uit het feit dat het niet mogelijk was om types uit te breiden zonder afgeleiden of wrappers te creëren, wat leidde tot een gecompliceerde architectuur en "vals" erfgoed.
De oplossing — extensiemethoden. In Visual Basic worden ze gedeclareerd als modules met statische methoden, gemarkeerd met het attribuut <Extension>. De eerste parameter van de methode duidt altijd het uit te breiden type aan, wat de mogelijkheid biedt om de methode aan te roepen als een gewone lid van het object.
Voorbeeldcode:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' Gebruik: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
Belangrijke kenmerken:
Kan een extensiemethode worden aangeroepen via de naam van de klasse, en niet via de instantie?
Ja, een extensiemethode kan ook worden aangeroepen via de naam van de uitbreidingsklasse als een statische methode, door de eerste (this/Me) parameter expliciet aan te geven.
Voorbeeldcode:
StringExtensions.ToTitleCase("test string")
Kan het gedrag van systeemmethoden worden overschreven (Override) via Extension Methods?
Nee, extensiemethoden overschrijven bestaande instantiemethoden niet. Bij overeenkomende namen wordt de oorspronkelijke methode van het type aangeroepen.
Kunnen extensiemethoden een variabel aantal argumenten (ParamArray) hebben, bijvoorbeeld voor strings?
Ja, ParamArray kan worden gebruikt in extensiemethoden, net zoals in gewone statische methoden.
In een groot project worden voor elk type eigen extensiemethoden gemaakt met overlappende namen en verschillende logica, zonder enige consistentie in stijl.
Voordelen:
Nadelen:
In het module worden alleen universele en goed gedocumenteerde extensies voor standaardbewerkingen op types verzameld. De naam van elke methode geeft duidelijk de bedoeling aan.
Voordelen:
Nadelen: