Tilläggsmetoder låter dig "lägga till" metoder till befintliga typer (inklusive typer du inte äger, som string eller int) utan att modifiera dem eller ärva från dem. De definieras som statiska metoder med en this-modifierare på den första parametern, och anropas som om de vore instansmetoder. LINQ är byggt på dem.
Definiera en tilläggsmetod
public static class StringExtensions
{
// `this string str` makes this an extension method ON string
public static bool IsValidEmail(this string str)
{
return str.Contains("@") && str.Contains(".");
}
public static string Truncate(this string str, int max)
{
return str.Length <= max ? str : str[..max] + "...";
}
}
// call them as if they were instance methods on string
"[email protected]".IsValidEmail(); // true
"long text here".Truncate(5); // "long ..."
this-modifieraren på den första parametern markerar metoden som en tillägg till den typen. Det är en statisk metod, men du anropar den som en instansmetod (str.IsValidEmail()), vilket läses naturligt.
Hur det fungerar (bara syntaktisk socker)
// these are equivalent — the extension call is sugar for a static call
"[email protected]".IsValidEmail();
StringExtensions.IsValidEmail("[email protected]");
Tilläggsmetoder är kompilatormagic — de är verkligen statiska metodanrop, men this-parameter-syntaxen låter dig anropa dem flytande som om de tillhörde typen. (De måste vara i en statisk klass och namnrymden importerad med using.)
LINQ ÄR tilläggsmetoder
// Where, Select, OrderBy, etc. are extension methods on IEnumerable<T>
list.Where(x => x > 0).Select(x => x * 2);
// → IEnumerable<T> has no Where method; LINQ ADDS them via extension methods
Alla av LINQs frågeopеratorer (Where, Select, osv.) är tilläggsmetoder på IEnumerable<T> — vilket är varför de kedjar så flytande. Det här är den mest framträdande användningen av tilläggsmetoder.
Varför det spelar roll
Tilläggsmetoder är en viktig och distinktiv C#-funktion, och att förstå dem är värdefullt både för att använda dem och för att förstå hur viktiga delar av C# fungerar — mest märkbart LINQ, som helt är byggt på tilläggsmetoder (operatorerna Where/Select/OrderBy är tillägg på IEnumerable<T>, vilket är varför de kedjar så flytande).
Funktionen låter dig lägga till funktionalitet till befintliga typer — inklusive sådana du inte äger (string, int, ramverkstyper) eller inte kan modifiera (förseglade klasser, gränssnitt) — utan arv eller att modifiera originalet, samtidigt som du håller en ren, flytande anropssyntax (str.IsValidEmail() läses som en instansmetod).
Det här är användbart för att skriva hjälpmetoder som utökar typer naturligt, bygga flytande API:er och lägga till beteende till gränssnitt.
Att förstå tilläggsmetoder — hur man definierar dem (this på den första parametern, i en statisk klass), att de är syntaktisk socker för statiska anrop, och särskilt att LINQ är byggt på dem — är viktig kunskap både för att skriva ren, flytande C#-hjälpare och för att förstå hur LINQ och många flytande .NET-API:er uppnår sin syntax.
Eftersom tilläggsmetoder ligger till grund för en av C#:s viktigaste funktioner (LINQ) och är ett vanligt sätt att utöka typer elegant, är kunskap om dem ofta använt kunnande som reflekterar förståelse för hur C#:s flytande, utökningsbara API:er fungerar — och låter dig skriva liknande ren, upptäckbar kod.
