Programmering

Hvordan jobbe med utvidelsesmetoder i C #

Programmeringsspråket C # gir støtte for utvidelsesmetoder fra C # 3.0. En utvidelsesmetode er en som brukes til å utvide funksjonaliteten til eksisterende typer ved å legge til metoder uten behov for å opprette nye avledede typer. Du trenger ikke å lage underklasser av eksisterende klasser eller kompilere eller endre dine eksisterende klasser for å jobbe med utvidelsesmetoder. Utvidelsesmetoder forbedrer lesbarheten til koden din, samtidig som du lar deg utvide funksjonaliteten til eksisterende typer.

De vanlige utvidelsesmetodene i .Net inkluderer LINQ standard spørreoperatører som legger til flere søkefunksjoner til System.Collections.IEnumerable og System.Collections.Generic.IEnumerable typer. Merk at du kan dra nytte av utvidelsesmetoder for å utvide en klasse eller et grensesnitt, men du kan ikke overstyre metodene deres. MSDN sier: "Utvidelsesmetoder lar deg" legge til "metoder til eksisterende typer uten å lage en ny avledet type, kompilere eller på annen måte endre den opprinnelige typen. Utvidelsesmetoder er en spesiell type statisk metode, men de kalles som om de var forekomstmetoder på den utvidede typen. "

I hovedsak er en utvidelsesmetode en spesiell type statisk metode og lar deg legge til funksjonalitet til en eksisterende type, selv om du ikke har tilgang til kildekoden til typen. En utvidelsesmetode er akkurat som en annen statisk metode, men har "denne" referansen som sin første parameter. Du kan legge til så mange utvidelsesmetoder du vil til hvilken som helst type. Viktigst, du kan også legge til utvidelsesmetoder til og med en verditype.

Når du arbeider med utvidelsesmetoder, må du huske disse punktene:

  • En utvidelsesmetode må være en statisk metode
  • En utvidelsesmetode må være innenfor en statisk klasse - klassen kan ha hvilket som helst navn
  • Parameteren i en utvidelsesmetode skal alltid ha "dette" nøkkelordet foran typen som metoden må kalles på

Merk at det du definerer en utvidelsesmetode på en type som har samme signatur som en hvilken som helst annen metode av typen du utvider, vil utvidelsesmetoden aldri kalles.

Programmering av utvidelsesmetoder i C #

I denne delen vil vi undersøke hvordan du programmerer utvidelsesmetoder ved bruk av C #. Følgende kodeliste illustrerer hvordan en utvidelsesmetode ser ut.

offentlig statisk klasse StringExtensions

    {

offentlig statisk bool IsNumeric (denne strengen str)

        {

dobbel utgang;

returner double.TryParse (str, out output);

        }

    }

Legg merke til den første parameteren til utvidelsesmetoden. Som allerede diskutert, bør enhver utvidelsesmetode være statisk og ha "dette" nøkkelordet foran parameteren du vil at metoden skal kalles på. Når du spesifiserer "dette" nøkkelordet i parameterlisten slik det er vist i eksemplet ovenfor, informerer du kompilatoren om at en utvidelsesmetode er definert for strengklassen.

Slik kan du bruke utvidelsesmetoden IsNumeric på en strenginstans.

statisk tomrom Main (streng [] args)

        {

streng str = "100";

hvis (str.IsNumeric ())

Console.WriteLine ("Strengobjektet med navnet str inneholder numerisk verdi.");

Console.Read ();

        }

Når du kjører ovennevnte program, vises meldingen ("Strengobjektet som heter str inneholder numerisk verdi." Vises i konsollvinduet.

Du kan bruke utvidelsesmetoder for å injisere ny funksjonalitet via metoder til en type uten behov for å endre, utlede eller kompilere den opprinnelige typen. Som jeg nevnte tidligere, kan utvidelsesmetoder også brukes på verdityper. La oss se hvordan dette kan oppnås med et eksempel.

Følgende klasse med navnet IntegerExtensions inneholder en utvidelsesmetode som heter IsEven som returnerer true hvis heltallet det heter på er jevnt, ellers falskt.

offentlig statisk klasse IntegerExtensions

    {

offentlig statisk bool IsEven (denne int i)

        {

retur ((i% 2) == 0);

        }

    }

Slik kan du bruke utvidelsesmetoden IsEven på et helt tall.

int n = 2;

hvis (n.IsEven ())

Console.WriteLine ("Verdien på heltallet er jevn.");

$config[zx-auto] not found$config[zx-overlay] not found