(Vorraussetzung dieses Tuts ist Kenntnis und richtiges Verständnis der Fachbegriffe, wie Modul, Methode, Klasse, Interface, Datentyp, etc.)
Extensions sind einfach Methoden in einem Modul - etwa hier eine Methode
Damit kann man zB den Datei-Typ eines Dateipfades ermitteln:
Eine Extension-Methode wird das einfach durch hinzufügen des
Nun kann mans wie eine ObjektMethode der String-Klasse aufrufen:was viel einfacher zu lesen und (dank Intellisense) zu schreiben ist.
Das ist im Grunde auch schon alles: Extensions sind ganz normale Methoden, nur tun sie als ob sie Objekt-Methoden wären.
Das erste Argument wird quasi "rausgezogen", und als Objekt vor die Methode gestellt, und dann siehts genauso aus wie eine Objekt-Methode - des ersten Arguments.
Und deshalb sinds eben Extensions - man kann nun (Pseudo-)Objekt-Methoden schreiben - aber ohne die Klasse zu verändern!
Nun kann man mit Extensions aber Datentypen ganz allgemein erweitern - nicht nur Klassen.
Auch Interfaces (sind ja auch Datentypen) kann man erweitern. Zum Beispiel durch exzessive Erweiterungen des
Vergleichbares kann man auch selber machen - nehmen wir mal das Interface
Diese Interface definiert: eine Klasse, die comparable sein will, muss eine Methode
Nun tritt es recht häufig auf, dass man ermitteln muss, ob ein Wert innerhalb eines bestimmten Bereiches liegt.
Da muss man jedesmal zwei Vergleiche verknüpfen:
Also wem das zu blöd ist, der kann sich ja eine Extension-Methode schreiben:
Nun kann er so machen:
Kurz: Mit Extensions kann man alles mögliche, was einem an irgendwelchen Datentyp-Features im Framework fehlen mag, selbst hinzu-programmieren
Generische Programmierung
Habt ihr sicher bemerkt: So nebenbei sind wir mit dem letzten Beispiel in die generische Programmierung eingestiegen. Nämlich meine
Das einzige, was die Methode über ihr
Dass
Und dank dieser Typ-Einschränkung verhält sich Intellisense nun auch intellisent:
<-- draufklicksen, damit es vergrößert wird!
Also ich empfehle sehr herzlich, das mitte TypEinschränkung und Kram selbst zu recherchieren, etwa - wie in VisualStudio nutzen gezeigt - indem man den Cursor auf das
Extensions sind einfach Methoden in einem Modul - etwa hier eine Methode
LastRightCut()
:VB.NET-Quellcode
- Imports System.Runtime.CompilerServices
- Public Module StringX
- ''' <returns>den Stringabschnitt ab dem letzten Auftreten von sMatch (ohne sMatch)</returns>
- Public Function LastRightCut(s As String, sMatch As String) As String
- Dim i = s.LastIndexOf(sMatch)
- If i < 0 Then Return Nothing
- Return s.Substring(i + sMatch.Length)
- End Function
- End Module
Eine Extension-Methode wird das einfach durch hinzufügen des
Extension
-Attributs:Nun kann mans wie eine ObjektMethode der String-Klasse aufrufen:was viel einfacher zu lesen und (dank Intellisense) zu schreiben ist.
Das ist im Grunde auch schon alles: Extensions sind ganz normale Methoden, nur tun sie als ob sie Objekt-Methoden wären.
Das erste Argument wird quasi "rausgezogen", und als Objekt vor die Methode gestellt, und dann siehts genauso aus wie eine Objekt-Methode - des ersten Arguments.
Und deshalb sinds eben Extensions - man kann nun (Pseudo-)Objekt-Methoden schreiben - aber ohne die Klasse zu verändern!
Nun kann man mit Extensions aber Datentypen ganz allgemein erweitern - nicht nur Klassen.
Auch Interfaces (sind ja auch Datentypen) kann man erweitern. Zum Beispiel durch exzessive Erweiterungen des
IEnumerable(Of T)
- Interfaces schafft Linq (Language Integrated Query) eine eigene (Abfrage-)Sprache innerhalb der Sprache.Vergleichbares kann man auch selber machen - nehmen wir mal das Interface
IComparable
, das ist folgendermaßen definiert (bitte überzeugt euch selbst davon - im ObjectBrowser):CompareTo(other)
aufweisen, mit der ein Objekt dieser Klasse sich mit einem anderen vergleicht. Zurückgegeben wird ein Integer, der 3 Bedeutungen haben kann:< 0
: Ich bin kleiner als der andere= 0
: Ich bin gleich-groß> 0
: Ich bin größer als der andere
String
, Char
, DateTime
, TimeSpan
und natürlich alle Zahl-Typen - ohne das könnte man zB überhaupt nicht sortieren.Nun tritt es recht häufig auf, dass man ermitteln muss, ob ein Wert innerhalb eines bestimmten Bereiches liegt.
Da muss man jedesmal zwei Vergleiche verknüpfen:
Generische Programmierung
Habt ihr sicher bemerkt: So nebenbei sind wir mit dem letzten Beispiel in die generische Programmierung eingestiegen. Nämlich meine
IsBetween()
- Methode hat einen Typ-Parameter T
. Das bedeutet, die Methode weiß gar nicht, was für ein Datentyp ihr übergeben wird - es kann jeder mögliche sein. Und das AufrufeBeispiel zeigt ja auch: Es funktioniert mit Integer
so gut wie mit String
.Das einzige, was die Methode über ihr
T
weiß ist, dass es IComparable
implementiert, und also die fabelhafte .CompareTo()
- Methode haben muss.Dass
IsBetween()
das weiß liegt an der Typ-Einschränkung, formuliert durch As IComparable
innerhalb des TypParameters der Methode (bitte nochmal gucken: zeile#4).Und dank dieser Typ-Einschränkung verhält sich Intellisense nun auch intellisent:
IsBetween()
wird mir nur bei comparablen Datentypen angeboten, bei anderen (wie etwa Button
oder FileInfo
) nicht:<-- draufklicksen, damit es vergrößert wird!
Also ich empfehle sehr herzlich, das mitte TypEinschränkung und Kram selbst zu recherchieren, etwa - wie in VisualStudio nutzen gezeigt - indem man den Cursor auf das
As
setzt, und dann F1
drückt. Vlt. kommt ihr ja auch erstmal hier raus, und weiterführend dann hier.Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()