Erweiterungsmethoden
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 39 von 70.
Erweiterungsmethoden ermöglichen es dir, bestehenden Typen neue Methoden hinzuzufügen, ohne ihren Quellcode zu ändern oder abgeleitete Klassen zu erstellen. Sie wirken, als wären sie native Methoden des Typs, wodurch dein Code lesbarer und intuitiver wird.
Um eine Erweiterungsmethode zu erstellen, definiere eine statische Methode in einer statischen Klasse, wobei dem ersten Parameter das Schlüsselwort this vorangestellt wird:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Jetzt kannst du diese Methode direkt für jeden String aufrufen:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Der Parameter this string str teilt dem Compiler mit, dass diese Methode den Typ string erweitert. Wenn du sentence.WordCount() aufrufst, übersetzt der Compiler dies im Hintergrund in StringExtensions.WordCount(sentence).
Erweiterungsmethoden können auch zusätzliche Parameter akzeptieren:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// Verwendung
bool result = "Hello".IsLongerThan(3); // trueDiese Technik wird in LINQ ausgiebig verwendet, wo Methoden wie Where() und Select() Erweiterungsmethoden für IEnumerable sind. Erweiterungsmethoden sind leistungsstark, um Typen, die du nicht kontrollierst, Hilfsfunktionen hinzuzufügen und deinen Code übersichtlich und ausdrucksstark zu halten.
Aufgabe
EinfachErstellen wir eine Reihe nützlicher Erweiterungsmethoden für Ganzzahlen, die praktische Funktionen hinzufügen, die man normalerweise als integriert erwarten würde. Du erstellst eine statische Klasse mit Erweiterungsmethoden, die direkt für jede Ganzzahl aufgerufen werden können, wodurch dein Code ausdrucksstärker und besser lesbar wird.
Du organisierst deinen Code auf zwei Dateien:
IntExtensions.cs: Erstelle eine statische Klasse namensIntExtensionsim NamespaceUtilities. Diese Klasse enthält Erweiterungsmethoden, die den Typinterweitern:IsEven()– gibttruezurück, wenn die Zahl gerade ist, andernfallsfalseSquare()– gibt die mit sich selbst multiplizierte Zahl zurückIsInRange(int min, int max)– gibttruezurück, wenn die Zahl zwischen min und max liegt (einschließlich), andernfallsfalse
thisverwendet, um anzugeben, welchen Typ du erweiterst.Program.cs: Lies in deiner Hauptdatei eine Ganzzahl aus der Eingabe ein und führe alle drei Erweiterungsmethoden vor. Rufe jede Methode direkt für die Ganzzahl auf, als wäre sie eine integrierte Methode, und gib anschließend die Ergebnisse aus.
Du erhältst drei Eingaben:
- Eine zu testende Zahl (Ganzzahl)
- Minimalwert für die Bereichsprüfung (Ganzzahl)
- Maximalwert für die Bereichsprüfung (Ganzzahl)
Gib die Ausgabe in diesem Format aus:
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}Wenn die Eingaben beispielsweise 7, 5 und 10 lauten, sollte die Ausgabe wie folgt aussehen:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? TrueBeachte, wie natürlich du number.IsEven() und number.Square() schreiben kannst – die Erweiterungsmethoden wirken, als wären sie schon immer Bestandteil des Ganzzahltyps gewesen!
Probier es selbst
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: Verwende die Erweiterungsmethoden auf 'number' und gib die Ergebnisse aus
// Rufe number.IsEven(), number.Square() und number.IsInRange(min, max) auf
// Gib im Format aus:
// Ist {number} gerade? {True/False}
// Quadrat von {number}: {result}
// Ist {number} im Bereich [{min}-{max}]? {True/False}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler