Erweiterungsmethoden
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 39 von 70.
Erweiterungsmethoden ermöglichen es Ihnen, neue Methoden zu bestehenden Typen hinzuzufügen, ohne deren Quellcode zu ändern oder abgeleitete Klassen zu erstellen. Sie erscheinen so, als wären sie native Methoden des Typs, was Ihren Code lesbarer und intuitiver macht.
Um eine Erweiterungsmethode zu erstellen, definieren Sie 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 können Sie diese Methode direkt auf jedem 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 Sie sentence.WordCount() aufrufen, ü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, wobei Methoden wie Where() und Select() Erweiterungsmethoden für IEnumerable sind. Erweiterungsmethoden sind leistungsstark, um Hilfsfunktionen zu Typen hinzuzufügen, die Sie nicht kontrollieren, wodurch Ihr Code sauber und ausdrucksstark bleibt.
Aufgabe
EinfachLassen Sie uns eine Reihe nützlicher Erweiterungsmethoden für Ganzzahlen erstellen, die praktische Funktionen hinzufügen, die man als integriert erwarten würde. Sie werden eine statische Klasse erstellen, die Erweiterungsmethoden enthält, die direkt auf jeder Ganzzahl aufgerufen werden können, wodurch Ihr Code ausdrucksstärker und lesbarer wird.
Sie werden Ihren Code auf zwei Dateien verteilen:
IntExtensions.cs: Erstellen Sie eine statische Klasse namensIntExtensionsim NamespaceUtilities. Diese Klasse wird Erweiterungsmethoden enthalten, die den Typinterweitern:IsEven()- gibttruezurück, wenn die Zahl gerade ist, andernfallsfalseSquare()- gibt die Zahl mit sich selbst multipliziert zurückIsInRange(int min, int max)- gibttruezurück, wenn die Zahl zwischen min und max liegt (einschließlich), andernfallsfalse
thisverwendet, um anzugeben, welchen Typ Sie erweitern.Program.cs: Lesen Sie in Ihrer Hauptdatei eine Ganzzahl aus der Eingabe ein und demonstrieren Sie alle drei Erweiterungsmethoden. Rufen Sie jede Methode direkt auf der Ganzzahl auf, als wäre sie eine integrierte Methode, und geben Sie dann die Ergebnisse aus.
Sie erhalten drei Eingaben:
- Eine zu testende Zahl (Ganzzahl)
- Mindestwert für die Bereichsprüfung (Ganzzahl)
- Maximalwert für die Bereichsprüfung (Ganzzahl)
Geben Sie 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 sind, sollte die Ausgabe wie folgt aussehen:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? TrueBeachten Sie, wie natürlich Sie number.IsEven() und number.Square() schreiben können – die Erweiterungsmethoden fühlen sich an, als wären sie schon immer Teil des Ganzzahl-Typs gewesen!
Spickzettel
Erweiterungsmethoden ermöglichen es Ihnen, bestehenden Typen neue Methoden hinzuzufügen, ohne deren Quellcode zu ändern. Sie müssen als statische Methoden in einer statischen Klasse definiert werden, wobei dem ersten Parameter das Schlüsselwort this vorangestellt wird.
Grundlegende Syntax für Erweiterungsmethoden:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Verwendung:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Das Schlüsselwort this vor dem ersten Parameter gibt an, welcher Typ erweitert wird. Der Compiler übersetzt sentence.WordCount() in StringExtensions.WordCount(sentence).
Erweiterungsmethoden mit zusätzlichen Parametern:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
bool result = "Hello".IsLongerThan(3); // trueProbier 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: Die Erweiterungsmethoden für 'number' verwenden und die Ergebnisse ausgeben
// number.IsEven(), number.Square() und number.IsInRange(min, max) aufrufen
// Im folgenden Format ausgeben:
// Ist {number} gerade? {True/False}
// Quadrat von {number}: {result}
// Liegt {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. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten