Øvelse – Kald metoderne for en .NET-klasse
- 12 minutter
Uanset om du har indset det eller ej, har du kaldt C# metoder lige siden din første "Hello, World!" program. Dette program bruger WriteLine()
klassens Console
metode til at vise meddelelsen "Hello, World!".
Det er dog ikke alle klasser og metoder, der implementeres på samme måde. Dette undermodul dækker nogle af de mest almindelige varianter, som du skal forstå, når du bruger metoder fra .NET-klassebiblioteket. Endnu vigtigere er det, at du lærer, hvordan du finder og bruger dokumentationen til bedre at forstå hver metode.
Sådan kalder du metoder i .NET-klassebiblioteket
Fra din tidligere erfaring med Console.WriteLine()
metoden bør du allerede kende de grundlæggende funktioner:
- Start med at skrive klassenavnet. I dette tilfælde er
Console
klassenavnet . - Tilføj medlemsadgangsoperatoren, symbolet
.
. - Tilføj metodens navn. I dette tilfælde er
WriteLine
navnet på metoden . - Tilføj operatoren til aktivering af metoden, som er et sæt parenteser
()
. - Til sidst skal du angive de argumenter, der overføres til metoden, hvis der er nogen, mellem parenteserne for aktiveringsoperatoren for metoden. I dette tilfælde skal du angive den tekst, som metoden skal
Console.WriteLine()
skrive til konsollen (f.eks."Hello World!"
).
Afhængigt af hvordan udviklerne har designet og implementeret den givne metode, kan det også være nødvendigt at:
- Overfør yderligere værdier som inputparametre.
- Acceptér en returværdi.
I det næste undermodul skal du undersøge, hvordan du overfører inputværdier til en metode, og hvordan en metode kan bruges til at returnere en værdi til kaldrutinen.
Selvom nogle metoder kan kaldes på samme måde, som du kaldte Console.WriteLine()
, er der andre metoder i .NET-klassebiblioteket, der kræver en anden tilgang.
Forbered dit kodemiljø
Dette modul indeholder kodeaktiviteter, der guider dig gennem processen med at bygge og køre eksempelkode. Du opfordres til at fuldføre disse aktiviteter ved hjælp af Visual Studio Code som dit udviklingsmiljø. Brug af Visual Studio Code til disse aktiviteter hjælper dig med at blive mere fortrolig med at skrive og køre kode i et udviklermiljø, der bruges af fagfolk over hele verden.
Åbn Visual Studio Code.
Du kan bruge Menuen Start i Windows (eller en tilsvarende ressource for et andet operativsystem) til at åbne Visual Studio Code.
Vælg Åbn mappe i menuen Filer i Visual Studio Code.
Gå til mappen Windows Desktop i dialogboksen Åbn mappe .
Hvis du har en anden mappeplacering, hvor du gemmer kodeprojekter, kan du i stedet bruge denne mappeplacering. Til denne træning er det vigtigt at have en placering, der er nem at finde og huske.
Vælg Vælg mappe i dialogboksen Åbn mappe.
Hvis du får vist en sikkerhedsdialogboks, hvor du bliver spurgt, om du har tillid til forfatterne, skal du vælge Ja.
Vælg Ny terminal i menuen Visual Studio Code Terminal.
Bemærk, at mappestien for den aktuelle mappe vises i en kommandoprompt i terminalpanelet. Det kan f.eks. være:
C:\Users\someuser\Desktop>
Notat
Hvis du arbejder på din egen pc i stedet for i en sandkasse eller et hostet miljø, og du har fuldført andre Microsoft Learn-moduler i denne C#-serie, har du måske allerede oprettet en projektmappe til kodeeksempler. Hvis det er tilfældet, kan du springe over næste trin, som bruges til at oprette en konsolapp i mappen TestProject.
Angiv følgende prompt ved kommandoprompten Terminal for at oprette et nyt konsolprogram i en angivet mappe:
dotnet new console -o ./CsharpProjects/TestProject
Denne .NET CLI-kommando bruger en .NET-programskabelon til at oprette et nyt C#-konsolprogramprojekt på den angivne mappeplacering. Kommandoen opretter mapperne CsharpProjects og TestProject for dig og bruger TestProject som navnet på filen
.csproj
.Hvis der vises en meddelelse om, at filerne allerede findes, skal du fortsætte med de næste trin. Du skal genbruge de eksisterende projektfiler.
Udvid mappen CsharpProjects i STIFINDER-visningen.
Du bør kunne se mappen TestProject og to filer, en C#-programfil med navnet Program.cs og en C#-projektfil med navnet TestProject.csproj.
Vælg Åbn mappe i menuen Filer i Visual Studio Code.
I dialogboksen Åbn mappe skal du vælge mappen CsharpProjects og derefter vælge Vælg mappe.
Udvid mappen TestProject i visningen STIFINDER, og vælg derefter Program.cs.
Slet de eksisterende kodelinjer.
Du skal bruge dette C#-konsolprojekt til at oprette, bygge og køre kodeeksempler under dette modul.
Luk terminalpanelet.
Kald forskellige typer metoder i .NET-klassebiblioteket
Hvis du vil oprette et kodeeksempel, der implementerer metoder for klasserne
System.Random
ogSystem.Console
i Visual Studio Code Editor, skal du angive følgende kode:Random dice = new Random(); int roll = dice.Next(1, 7); Console.WriteLine(roll);
Denne kode simulerer et terningekast ved hjælp af
Random.Next()
metoden til at generere et tal og metodenConsole.WriteLine()
til visning af værdien.Notat
Du skal undersøge koden detaljeret senere i dette undermodul.
Klik på Gem i menuen Filer i Visual Studio Code.
Hvis du vil åbne en Terminal på placeringen af mappen TestProject i STIFINDER-visningen, skal du højreklikke på TestProject og derefter vælge Åbn i integreret terminal.
Bemærk, at terminalpanelet indeholder en kommandoprompt, der viser en mappesti. Det kan f.eks. være:
C:\Users\someuser\Desktop\CsharpProjects\TestProject>
Når du bruger Terminal til at køre .NET CLI-kommandoer, køres kommandoer fra den viste mappeplacering. Sørg for, at kodemappen svarer til den mappesti, der vises i kommandoprompten, før du bygger eller kører koden.
I kommandoprompten Terminal skal du skrive dotnet run og derefter trykke på Enter for at køre din kode.
Bemærk, at der vises et tal mellem 1 og 6 i konsoloutputtet (antallet af prikker på terningerne). Hvis du kører koden nok gange, får du vist hvert af tallene 1-6.
Brug et minut på at undersøge den syntaks, der bruges til at få adgang til metoderne
Next()
ogWriteLine()
.Bemærk, at du bruger forskellige teknikker til at få adgang til metoderne.
Random dice = new Random(); int roll = dice.Next(1, 7); Console.WriteLine(roll);
På den tredje kodelinje skal du inkludere en reference til
Console
klassen og kaldeConsole.WriteLine()
metoden direkte. Du bruger dog en anden teknik til at kaldeRandom.Next()
metoden. Grunden til, at du bruger to forskellige teknikker, er, at nogle metoder er "stateful", og andre er "statsløse". Du undersøger forskellen mellem stateful- og stateless-metoder i næste afsnit.
Stateful versus stateless-metoder
I softwareudviklingsprojekter bruges begrebet tilstand til at beskrive tilstanden af udførelsesmiljøet på et bestemt tidspunkt. Når din kode udføres linje for linje, gemmes værdier i variabler. Når som helst under udførelsen er den aktuelle tilstand for programmet samlingen af alle værdier, der er gemt i hukommelsen.
Nogle metoder er ikke afhængige af programmets aktuelle tilstand for at fungere korrekt. Med andre ord implementeres tilstandsløse metoder , så de kan fungere uden at referere til eller ændre værdier, der allerede er gemt i hukommelsen. Stateless-metoder kaldes også statiske metoder.
Metoden er f.eks. ikke afhængig af værdier, Console.WriteLine()
der er gemt i hukommelsen. Den udfører sin funktion og slutter uden at påvirke programmets tilstand på nogen måde.
Andre metoder skal dog have adgang til programmets tilstand for at fungere korrekt. Med andre ord er stateful-metoder bygget på en sådan måde, at de er afhængige af værdier, der er gemt i hukommelsen af tidligere kodelinjer, der allerede er blevet udført. Eller de ændrer programmets tilstand ved at opdatere værdier eller gemme nye værdier i hukommelsen. De kaldes også forekomstmetoder.
Stateful-metoder (forekomst) holder styr på deres tilstand i felter, som er variabler, der er defineret i klassen. Hver ny forekomst af klassen får sin egen kopi af de felter, hvor tilstanden skal gemmes.
En enkelt klasse kan understøtte både stateful- og stateless-metoder. Men når du har brug for at kalde stateful-metoder, skal du først oprette en forekomst af klassen, så metoden kan få adgang til tilstanden.
Oprettelse af en forekomst af en klasse
En forekomst af en klasse kaldes som et objekt. Hvis du vil oprette en ny forekomst af en klasse, skal du bruge operatoren new
. Overvej følgende kodelinje, der opretter en ny forekomst af Random
klassen for at oprette et nyt objekt kaldet dice
:
Random dice = new Random();
Operatoren new
gør flere vigtige ting:
- Den anmoder først om en adresse i computerens hukommelse, der er stor nok til at gemme et nyt objekt baseret på
Random
klassen. - Det opretter det nye objekt og gemmer det på hukommelsesadressen.
- Den returnerer hukommelsesadressen, så den kan gemmes i objektet
dice
.
Når der dice
refereres til objektet i kode, udfører .NET Runtime derefter et opslag i baggrunden for at give den illusion, at du arbejder direkte med selve objektet.
Din kode bruger objektet dice
som en variabel, der gemmer klassens Random
tilstand. Når du kalder Next()
metoden på dice
objektet, bruger metoden den tilstand, der er gemt i dice
objektet, til at generere et tilfældigt tal.
Den nyeste version af .NET Runtime giver dig mulighed for at instantiere et objekt uden at skulle gentage typenavnet (aktivering af konstruktøren, der er angivet som destination). Følgende kode opretter f.eks. en ny forekomst af Random
klassen:
Random dice = new();
Hensigten er at forenkle kodelæsbarheden. Du bruger altid parenteser, når du skriver et måludtryk new
.
Hvorfor er next()-metoden stateful?
Du undrer dig måske over, hvorfor Next()
metoden blev implementeret som en stateful-metode? Kunne designerne af .NET-klassebiblioteket ikke finde ud af, hvordan de kan generere et tilfældigt tal uden at kræve tilstand? Og hvad der præcist gemmes eller refereres til af metoden Next()
?
Det er rimelige spørgsmål. På et højt niveau er computere gode til at følge specifikke instruktioner for at skabe et pålideligt og gentageligt resultat. For at skabe illusionen om tilfældighed besluttede udviklerne Next()
af metoden at registrere dato og klokkeslæt ned til brøkdelen af et millisekunder og bruge det til at seede en algoritme, der producerer et andet tal hver gang. Selvom det ikke er helt tilfældigt, er det tilstrækkeligt for de fleste applikationer. Den tilstand, der registreres og vedligeholdes gennem objektets dice
levetid, er seedværdien. Hvert efterfølgende kald til Next()
metoden kører algoritmen igen, men sikrer, at seed ændres, så den samme værdi ikke (nødvendigvis) returneres.
Hvis du vil bruge Random.Next()
metoden , behøver du dog ikke at forstå , hvordan den fungerer. Det vigtige at vide er, at nogle metoder kræver, at du opretter en forekomst af en klasse, før du kalder dem, mens andre ikke gør det.
Hvordan kan du afgøre, om du har brug for at oprette en forekomst af en klasse, før du kalder dens metoder?
En metode til at afgøre, om en metode er stateful eller stateless, er at se dokumentationen. Dokumentationen indeholder eksempler, der viser, om metoden skal kaldes fra objektforekomsten eller direkte fra klassen.
Notat
Du skal muligvis rulle ned på dokumentationssiden for at finde kodeeksemplerne.
Som et alternativ til at søge i produktdokumentationen kan du forsøge at få adgang til metoden direkte fra selve klassen. Hvis det virker, ved du, at det er en tilstandsløs metode. Det værste, der kan ske, er, at du får en kompileringsfejl.
Prøv at få direkte adgang til Random.Next()
metoden, og se, hvad der sker.
Angiv følgende kodelinje i Visual Studio Code Editor:
int result = Random.Next();
Du ved allerede, at det
Next()
er en tilstandsfuld metode, men dette eksempel viser, hvordan Visual Studio Code Editor reagerer, når du forsøger at få forkert adgang til en metode.Bemærk, at der vises en rød bølgestreg under
Random.Next
, hvilket angiver, at du har en kompileringsfejl.Hvis den metode, du er interesseret i at bruge, er statsløs, vises der ingen rød bølgestreg.
Hold musemarkøren over den røde bølgestreg.
Der vises et pop op-vindue med følgende meddelelse:
(1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'
Som du så i koden i starten af enheden, kan du løse denne fejl ved at oprette en forekomst af
Random
klassen, før du fårNext()
adgang til metoden. Det kan f.eks. være:Random dice = new Random(); int roll = dice.Next();
I dette tilfælde
Next()
kaldes metoden uden inputparametre.
Resumé
- Hvis du vil kalde metoder for en klasse i .NET-klassebiblioteket, skal du bruge formatet
ClassName.MethodName()
, hvor symbolet.
er medlemsadgangsoperatoren til at få adgang til en metode, der er defineret i klassen, og symbolerne()
er operatorerne for aktivering af metoden. - Når du kalder en tilstandsløs metode, behøver du ikke at oprette en ny forekomst af dens klasse først.
- Når du kalder en tilstandsmetode, skal du oprette en forekomst af klassen og få adgang til metoden på objektet.
- Brug operatoren
new
til at oprette en ny forekomst af en klasse. - En forekomst af en klasse kaldes som et objekt.