Extension Methods definieren
Schreiben Sie statische Methoden mit dem Modifizierer this.
Extension Methods definieren ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist eine Erweiterungsmethode?
Eine Erweiterungsmethode ermöglicht es Ihnen, einem vorhandenen Typ neue Methoden hinzuzufügen, ohne ihn zu ändern oder einen abgeleiteten Typ zu erstellen. Sie rufen sie auf, als wäre sie eine Instanzmethode, tatsächlich handelt es sich jedoch um eine spezielle static-Methode.
Erweiterungsmethoden eignen sich ideal, wenn Ihnen der Quellcode eines Typs, etwa string oder int, nicht gehört, Sie ihm aber ein praktisches neues Verhalten geben möchten.
Die drei Voraussetzungen
Um eine Erweiterungsmethode zu deklarieren, benötigen Sie eine statische Klasse, eine statische Methode und einen ersten Parameter, der mit dem Schlüsselwort this gekennzeichnet ist. Der this-Parameter gibt den Typ an, den Sie erweitern.
using System;
public static class StringExtensions
{
public static int WordCount(this string text)
{
if (string.IsNullOrWhiteSpace(text)) return 0;
return text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
public class Program
{
public static void Main()
{
string sentence = "the quick brown fox";
Console.WriteLine(sentence.WordCount());
}
}Aufruf wie eine Instanzmethode
Obwohl WordCount statisch ist, rufen Sie es als sentence.WordCount() auf. Der Compiler schreibt diesen Aufruf im Hintergrund in StringExtensions.WordCount(sentence) um.
using System;
using System.Linq;
public static class StringExtensions
{
public static string Repeat(this string text, int times)
{
return string.Concat(Enumerable.Repeat(text, times));
}
}
public class Program
{
public static void Main()
{
// These two lines do exactly the same thing
Console.WriteLine("ab".Repeat(3));
Console.WriteLine(StringExtensions.Repeat("ab", 3));
}
}Der this-Parameter erhält die Instanz
Der Wert links vom Punkt wird zum this-Parameter. Sie können danach weitere Parameter hinzufügen, die von den Aufrufern wie gewohnt übergeben werden.
using System;
public static class IntExtensions
{
public static bool IsBetween(this int value, int low, int high)
{
return value >= low && value <= high;
}
}
public class Program
{
public static void Main()
{
int age = 25;
Console.WriteLine(age.IsBetween(18, 65));
Console.WriteLine(10.IsBetween(1, 5));
}
}Eigene Typen erweitern
Erweiterungsmethoden sind nicht nur für Bibliothekstypen gedacht. Sie können auch Ihre eigenen Klassen erweitern. So bleibt der zentrale Typ übersichtlich, während Sie an anderer Stelle zusätzliche Hilfsfunktionen bereitstellen.
using System;
public class Money
{
public decimal Amount { get; }
public Money(decimal amount) { Amount = amount; }
}
public static class MoneyExtensions
{
public static string ToUsd(this Money m) => "$" + m.Amount.ToString("0.00");
}
public class Program
{
public static void Main()
{
var price = new Money(19.5m);
Console.WriteLine(price.ToUsd());
}
}Erweiterungsmethoden können nicht auf private Member zugreifen
Eine Erweiterungsmethode ist lediglich eine statische Methode in einer anderen Klasse und kann daher nur auf die public-Oberfläche des Typs zugreifen, oder auf die internal-Oberfläche, wenn sie sich in derselben Assembly befindet. Auf private Felder kann sie nicht zugreifen.
using System;
public class Counter
{
private int _count;
public int Value => _count;
public void Increment() => _count++;
}
public static class CounterExtensions
{
// Can only use public members like Value and Increment
public static bool IsZero(this Counter c) => c.Value == 0;
}
public class Program
{
public static void Main()
{
var c = new Counter();
Console.WriteLine(c.IsZero());
c.Increment();
Console.WriteLine(c.IsZero());
}
}Erweiterungsmethoden verketten
Da jede Erweiterungsmethode einen Wert zurückgibt, können Sie sie zu einer Fluent-Pipeline verketten. Dieser Aufbau liest sich von oben nach unten und wird von LINQ verwendet.
using System;
public static class TextExtensions
{
public static string Shout(this string s) => s.ToUpper();
public static string Bang(this string s) => s + "!";
}
public class Program
{
public static void Main()
{
string result = "hello".Shout().Bang();
Console.WriteLine(result);
}
}null und Erweiterungsmethoden
Im Gegensatz zu einem echten Instanzaufruf kann eine Erweiterungsmethode auch ausgeführt werden, wenn der Empfänger null ist, weil erst dann eine Dereferenzierung erfolgt, wenn Ihr Code auf ihn zugreift. So können Sie null-sichere Hilfsmethoden schreiben.
using System;
public static class StringExtensions
{
public static bool IsBlank(this string text)
{
// text may be null here, and that is fine
return string.IsNullOrWhiteSpace(text);
}
}
public class Program
{
public static void Main()
{
string nothing = null;
Console.WriteLine(nothing.IsBlank());
Console.WriteLine("x".IsBlank());
}
}Instanzmethoden haben Vorrang vor Erweiterungen
Wenn eine echte Instanzmethode mit passender Signatur vorhanden ist, bevorzugt der Compiler immer diese gegenüber einer Erweiterungsmethode. Erweiterungsmethoden schließen nur Lücken, die der Typ noch nicht abdeckt.
using System;
public static class Ext
{
// This will be ignored because string already has ToString()
public static string ToString(this string s, int n) => s + n;
}
public class Program
{
public static void Main()
{
// Resolves to the built-in instance ToString(), not the extension
Console.WriteLine("value: " + "abc".ToString());
}
}Eine praktische Hilfsbibliothek
Wenn Sie zusammengehörige Erweiterungsmethoden in einer statischen Klasse gruppieren, entsteht eine übersichtliche Hilfsbibliothek. Hier ist eine kleine numerische Hilfsklasse, die Sie in mehreren Projekten wiederverwenden könnten.
using System;
public static class NumberExtensions
{
public static bool IsEven(this int n) => n % 2 == 0;
public static int Squared(this int n) => n * n;
public static double Percent(this int n) => n / 100.0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(4.IsEven());
Console.WriteLine(5.Squared());
Console.WriteLine(50.Percent());
}
}Probieren Sie es selbst aus
Wenden Sie Ihr Wissen an: eine statische Klasse mit mehreren spezialisierten Erweiterungsmethoden, die sich flüssig verketten lassen. Genau so werden praktische Hilfsbibliotheken erstellt.
using System;
public static class StringExtensions
{
public static string Capitalize(this string s)
=> string.IsNullOrEmpty(s) ? s : char.ToUpper(s[0]) + s.Substring(1);
public static string Surround(this string s, char c) => c + s + c;
}
public class Program
{
public static void Main()
{
Console.WriteLine("hello".Capitalize().Surround('*'));
}
}Kurzer Test
Testen Sie Ihr Verständnis der Deklaration von Erweiterungsmethoden.
Rückblick
Sie haben gelernt, dass eine Erweiterungsmethode eine static-Methode in einer static-Klasse ist, deren erster Parameter this verwendet. Sie wird mit Instanzsyntax aufgerufen, aber in einen normalen statischen Aufruf kompiliert.
- Drei Voraussetzungen: statische Klasse, statische Methode,
thisals erster Parameter. - Nur public-Member sind erreichbar.
- Instanzmethoden haben immer Vorrang.
- Erweiterungsmethoden können verkettet werden und sogar für
null-Empfänger ausgeführt werden.
Häufig gestellte Fragen
Ist die Lektion „Extension Methods definieren“ kostenlos?
Ja — der vollständige Text von „Extension Methods definieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Extension Methods definieren“?
Schreiben Sie statische Methoden mit dem Modifizierer this. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Extension Methods definieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Extension Methods definieren
- Interfaces und Generics erweitern
- Auflösung von Extension Methods
- Gute Extensions entwerfen