Visual C# 2012 Grundkurs

Extension-Klasse

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Durch die Verwendung einer Extension-Klasse können bestehende Klassen erweitert werden, ohne die Vererbungshierarchie zu benutzen. Dies ermöglicht die elegante Vereinfachung eines Codes.

Transkript

In diesem Abschnitt möchte ich mich mit Extension Classes beschäftigen. Dazu will ich ein Beispiel zeigen, lege dafür eine String-Variable an, und die kriegt jetzt irgendwelche Werte, ich tue irgendwo eine Zahl herein. Was ich jetzt sehr leicht machen kann, ist, dass ich von diesem String irgendeinen Index abfrage, z.B. von dieser Zahl. Ich sage einfach: Wenn in diesem String ein Buchstabe auftaucht, der die Ziffer 4 repräsentiert, dann zeige mir bitte den Index davon. Es wäre also jetzt der Index 8, und wenn ich jetzt irgendetwas nehme, was nicht vorhanden ist, dann kommt der Index "-1" zurück. Das ist in ".NET" so Usus, dass wenn man nach dem Index von etwas fragt und dieses Etwas existiert nicht, dann kommt  "-1" zurück. Das ist alles recht und schön, aber eigentlich wäre es ganz interessant, mal zu sehen: enthält dieser String eine Ziffer, also egal ob eine 1 oder 5? So ein Code ist nicht eben in einer solchen Zeile zu schreiben. Auf der anderen Seite gibt es einfach auch keine Methode der Klasse "String", die so etwas bewerkstelligen könnte. Jetzt könnten wir sagen, es ist kein Problem, wir leiten einfach eine weitere Klasse von der Klasse "String" ab, und die hat dann einfach eine Methode, die genau nach so einer Ziffer suchen kann. Ok, gesagt, getan: "sun class my string, string". Jetzt merken Sie schon allein an der Farbe, dass hier etwas nicht stimmt. Was hier nicht stimmt, das sehen wir, wenn wir kompilieren. Da heißt es: "Cannot derive from sealed type String". Die Klasse String ist offensichtlich "sealed", was soviel heißt wie "versiegelt". Also man kann nichts davon ableiten. Es gibt im Übrigen gute Gründe, Klassen "sealed" zu schreiben, und gerade bei String gibt es diesen guten Grund. Und der Grund ist, dass die Klasse String eine sogenannte "immutable" Klasse ist, also d.h. dass Objekte von dieser Klasse nicht manipuliert werden können, sondern dass jede Veränderung ein neues Objekt vom Typ String erzeugt. Und genau deswegen möchte man auch nicht, dass man von Strings ableiten kann. Man möchte nicht den Status von Objekten der Klasse String veränderbar haben. Deswegen ist die Klasse "String sealed", also D.h., wenn ich jetzt hier irgendeine Klasse schreibe, dann kann ich hier dieses Schlüsselwort "sealed" dazuschreiben, und dann ist die Klasse versiegelt. So ist es mit dem String. Und das bedeutet, ich kann von der Klasse String nichts ableiten; muss ich aber auch gar nicht, denn es gibt einen anderen Weg, wie ich die Klasse String erweitern kann. Wenn ich jetzt z.B. diese Suche nach diesen Ziffern in so einem String relativ häufig brauche in einem System, dann kann ich also sozusagen innerhalb der Code-Teile wo ich diese Funktionalität brauche, eine sogenannte Extension-Klasse sichtbar machen. Das mache ich jetzt gerade mal. "My String Extensions", so soll diese Klasse heißen. Das heißt natürlich hier "Public Statik", ok. Und damit kann ich diese String-Extensions überall benutzen. Und innerhalb dieser Extension-Klasse, da kann ich ja jetzt nur statische Methoden schreiben. Das hat auch seinen ganz bestimmten Sinn. Jetzt kann ich da eine Methode schreiben, die sehe etwa so aus. "Public Statik integer Index Off Reg". "Reg" steht für eine Regular Expression. Und jetzt benutze ich das Schlüsselwort "this" vor einem Parameter. Und die Methode hat noch einen weiteren Parameter, nämlich einen String, der eine "Regular Expression" ist. Also das heißt, vielleicht googlen Sie mal nach den Regular Expressions. Es gibt eine sehr leistungsfähige Methode, innerhalb von Strings nach Substrings zu suchen. Diese Methode heißt "Regular Expressions" und das Microsoft .NET-Framework hat eine Implementierung von diesen Regular Expressions. Entsprechend kann ich die jetzt verwenden, um innerhalb von einem String nach so einer Regular Expression zu suchen. Also: ich suche innerhalb des Strings die Expression. Das ist eine statische Methode, die gibt einen Integer-Wert zurück, die nimmt einen Parameter, nämlich diesen String, und sie nimmt einen zweiten Parameter, das ist diese Expression. Diese Expression soll in dem String gesucht werden. Jetzt schreibe ich erstmal den Code. Der Code, der nimmt diese "RegEx"-Klasse aus dem .NET-Framework die ist eben hier in diesem "namesystem.text.regularexpressions" versteckt. Und ich lege ein Objekt von dieser "RegEx"-Klasse an und sag jetzt dieser "RegEx"-Klasse: "Gib mir einen Match von dieser Expression mit dem String S." Zurück kommt ein sogenanntes Match-Objekt. Und dieses Match-Objekt, das kann ich jetzt befragen: War das ganze erfolgreich? Also, ist diese Expression in diesem String gefunden worden? Das kann ich also mit dem "property match.success" abfragen. Jetzt sage ich: Wenn es kein Erfolg ist, dann gib eine "-1" zurück. Also das heißt, da folge ich den Geflogenheiten in .Net Der Index ist nicht gefunden worden. Das heißt "-1". Ansonsten kann ich zurückgeben, ein Property Index von diesem Match. Das ist genau der Index, von dem, wonach ich gesucht habe. Nehmen wir jetzt grade nochmal dieses Schlüsselwort "this" hier weg. Was ich also jetzt machen könnte, wenn ich also x-beliebige Ziffern in diesem String suchen wollte, dann würde ich eben schreiben: "indi=My String Extensions.index of reg". Jetzt mein String und jetzt diese Regular Expression. Und jetzt muss ich hier einen String angeben, der einen Back-Slash enthält. Das ist hier meine Regular Expression, und innerhalb dieser Regular Expression leitet ein Backslash ein Symbol ein, das eine bestimmte Bedeutung hat. Und das Symbol "D", das bedeutet "Digit". Also, diese Expression sagt mir: "Suche innerhalb von einem String nach einem Digit." Wenn ich das ohne diese Klammeraffen hier schreiben will, würde der Compiler hier einen Fehler anzeigen: "unrecognized escape sequence". Das heißt, innerhalb von Strings in C# kann man ja mit diesen Backslashs bestimmte Sonderzeichen eingeben. "\N" heißt zum beispiel "new line", also eine neue Zeile, "\T" heißt "Tab", also das ist ein Tabulatorzeichen. Also all die Dinge, die man nicht mit normalen Buchstaben darstellen kann-- also das hier wäre jetzt zum Beispiel ein Tabulator. Jetzt ist es aber so-- "\D", das gibt es nicht als Escape Sequenz. Dem ist einfach nichts zugeordnet. Das ist auch gut so, das will ich auch gar nicht. Ich will ja gar keine Escape-Sequenz, sondern ich will ja tatsächlich den String "\D". Man hat jetzt zwei Wege, wie man das erreichen kann. Das eine ist das hier. Dieser Backslash leitet eine Escape-Sequenz ein und der zweite Backslash sagt mir: "Ok, dieses Escape-Zeichen soll ein Backslash sein." Und am Ende des Tages werden diese beiden Backslashes nacheinander im String-- also die bedeuten einen Backslash. Das heißt, unter Windows gibt man ja Pfadnamen mit einem Backslash ein; wenn man hier jetzt zum Beispiel den Pfad angeben würde, dann würde das irgendwie so ausschauen. So würde man in C# Strings schreiben. Und genauso kann ich an der Stelle "\D" eingeben. Die zweite Möglichkeit ist die, dass ich vor diesem String einen Klammeraffen setze und damit sage ich dem C#: "Ich will keine Escape-Sequenzen, die gibt es nicht, nimm jedes Zeichen wie es kommt". Da kann man ganz wundervolle Dinge machen, also zum einen, ich kann jetzt hier dieses "\D" eingeben, zum anderen, ich kann auch Pfadnamen mit einfachen Backslashes angeben und zum anderen ist, ich kann hier auch Zeilenvorschübe eingeben. Das wäre alles wunderbar, ich kann das kompilieren, der Compiler hat damit kein Problem. Was macht er? Er interpretiert diesen Zeilenvorschub tatsächlich als das, was er ist; als eine Zeichenfolge "carriage return line feed". Das war jetzt mein kurzer Ausflug zur Schreibweise von Strings, und jetzt übergebe ich auf diese Weise diese Regular Expression. Jetzt kann ich hier an der Stelle mit diesem Index irgendetwas ausführen. Das machen wir jetzt gerade einmal und das Resultat ist "8". Jetzt könnte ich hier nach diesem "\D" noch irgendetwas dazu tun, das ist jetzt gerade schlecht. Nehmen wir irgend sowas, was es noch nicht gibt, und wenn ich den Code jetzt aufrufe, dann wird das nicht gefunden und daher kommt der Index "-1" zurück. Zurück zu unserem Beispiel. Das is ja jetzt schon mal ganz elegant. Ich habe innerhalb einer Zeile, sagen wir mal, das erreicht, was ich haben will. Aber es geht noch eleganter, und da kommt jetzt dieses Schlüsselwort "this" dazu. Dieses Schlüsselwort "this" sagt dem Compiler jetzt: "Index Offreck" soll eine Extensionmethode der Klasse String sein. Also immer des Typs vom ersten Parameter. Immer des Parameters vor dem ich das "this" Schlüsselwort schreibe. Mein erster Parameter wird also mit diesem "this" eingeleitet, dann weiß der Compiler: Aha, "Extension Method". Dann kommt der Typname, dann weiß der Compiler: Aha, das ist eine Extension des Typs String. Und das sind einfach weitere Parameter optional natürlich, also ich muss hier jetzt keinen Parameter angeben, wenn ich keinen brauche, aber in dem Fall brauche ich ja einen, und das ist eben diese Expression. Jetzt kann ich diesen Ausdruck in einer ganz wunderbaren Weise schreiben, nämlich so, als wäre "index of reg" eine Methode der Klasse String. Ist das nicht wunderbar? Also es ist auch tatsächlich so, dass Visual Studio mir dieses "index of reg" im IntelliSense anzeigt. Wie, als wenn es eine Methode der Klasse String wäre. Also, das ist eine ganz wunderbare Sache. Ich kann jetzt mal zeigen, dass Microsoft selbst von diesen Extensions-Methoden sehr ausgiebig Gebrauch macht. Und deshalb habe ich hier diese Zeile, die normalerweise in einer frischen Consolenapplikation und Bibliothek, wenn man ein frisches Projekt in Visual Studio eröffnet, dann ist nämlich gleich diese Zeile hier oben, diese "Using-Zeile" für diesen "NameSpace System.Link" enthalten. Wenn ich jetzt noch mal hier auf den Punkt gehe, und die IntelliSense-Liste öffne, dann sehen Sie, es kommen da ein Haufen Methoden, die jetzt bei der String-Klasse mehr oder weniger Sinn machen. Aber man kann das vor allem sehr gut für Enumerations und Container-Klassen verwenden, das war hier alles steht. Also da hat Microsoft ganze Arbeit geleistet, mit einer Menge Erweiterungen für die Klassen. Hier kann man z.B. so richtiggehende, mit diesem "where", "Substrings" abfragen usw. usf. - das ist alles eine ganz wunderbare Sache. Wie gesagt, das Schöne ist, wir können selbst Extension-Klassen schreiben. Und alles, was man dann braucht, um diese Extensions zu benutzen, ist eine Referenz auf die entsprechende DLL, in der wir diese Extensions unterbringen und diese Using Statements, die uns dann den Namespace eröffnen. Dann zeigt uns IntelliSense alle Extension-Methoden an, die wir selbst geschrieben haben. Am Ende bleibt vielleicht noch zu sagen: Extensions werden immer in statischen Klassen definiert, weil sie immer in statischen Methoden sein müssen. Also widmen Sie eigene statische Klassen der Extension von ganz bestimmten Typen. Das wäre es gewesen zum Abschnitt über Extension Classes.

Visual C# 2012 Grundkurs

Schreiben Sie eigene Programme in C# und lernen Sie dazu alle Schlüsselwörter und die meisten Konstrukte kennen, um sicher mit dieser Programmierspreche umzugehen.

7 Std. 1 min (44 Videos)
Hilfreich - Aber ohne GUI
TANNER Lizenz1
Das Tutorial vermittelt einem die Grundfunktionalitäten von C# auf der Konsole sehr gut. Diesbezüglich hat man danach wirklich einen Überblick. Allerdings das Thema GUI in C# wird garnicht behandelt.
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!