Övning – Returnera värden och parametrar för metoder
- 18 minuter
I föregående lektion använde du kodningsscenariot "roll dice" för att illustrera skillnaden mellan tillståndskänsliga (instans) och tillståndslösa (statiska) metoder. Samma scenario kan hjälpa dig att förstå andra viktiga begrepp om samtalsmetoder. Till exempel:
- hantering av returvärdet för en metod.
- metodparametrar och skicka argument till en metod.
- välja en överbelastad version av en metod.
Returnera värden
En del metoder är utformade för att utföra sin funktion och avsluta ”tyst”. Med andra ord returnerar de inte något värde när de är klara. De kallas för void-metoder.
Andra metoder är utformade för att returnera ett värde när det är klart. Returvärdet är vanligtvis resultatet av en åtgärd. Ett returvärde är det primära sättet för en metod att kommunicera tillbaka till den kod som anropar metoden.
Du såg att Random.Next() metoden returnerar en int typ som innehåller värdet för det slumpmässigt genererade talet. En metod kan dock utformas för att returnera alla datatyper, till och med en annan klass. Klassen har till exempel String några metoder som returnerar en sträng, några som returnerar ett heltal och några som returnerar ett booleskt värde.
När du anropar en metod som returnerar ett värde tilldelar du ofta returvärdet till en variabel. På så sätt kan du använda värdet senare i koden. I tärningsscenariot tilldelade du returvärdet Random.Next() för variabeln roll :
int roll = dice.Next(1, 7);
I vissa fall kanske du vill använda returvärdet direkt, utan att tilldela det till en variabel. Du kanske till exempel vill skriva ut returvärdet till konsolen på följande sätt:
Console.WriteLine(dice.Next(1, 7));
Även om en metod returnerar ett värde kan du anropa metoden utan att använda returvärdet. Du kan till exempel ignorera returvärdet genom att anropa metoden enligt följande:
dice.Next(1, 7);
Det skulle dock vara meningslöst att ignorera returvärdet. Anledningen till att du anropar Next() metoden är att du kan hämta nästa slumpmässiga värde.
Metodparametrar och argument i anropande instruktion
När du anropar en metod kan du skicka in värden som metoden ska använda för att slutföra uppgiften. Dessa värden kallas argument. Metoden använder argumenten för att tilldela värden till de parametrar som definieras i metodens signatur. En metod kan kräva en eller flera parametrar för att utföra sin uppgift, eller ingen alls.
Anmärkning
Ofta används termerna "parameter" och "argument" omväxlande. Parametern refererar dock till variabeln som används i metoden. Ett argument är det värde som skickas när metoden anropas.
De flesta metoder är utformade för att acceptera en eller flera parametrar. Parametrarna kan användas för att konfigurera hur metoden utför sitt arbete, eller så kan de köras direkt. Metoden använder till exempel Random.Next() parametrar för att konfigurera de övre och nedre gränserna för returvärdet. Använder dock Console.WriteLine() parametern direkt genom att skriva ut värdet till konsolen.
Metoder använder en metodsignatur för att definiera antalet parametrar som metoden accepterar, samt datatypen för varje parameter. Kodningssatsen som anropar metoden måste följa de krav som anges av metodsignaturen. Vissa metoder innehåller alternativ för antalet och typen av parametrar som metoden accepterar.
När en anropare anropar metoden innehåller den konkreta värden, som kallas argument, för varje parameter. Argumenten måste vara kompatibla med parametertypen. Men argumentnamnet, om ett används i anropskoden, behöver inte vara samma som parameternamnet som definierats i metoden.
Överväg följande kod:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
Den första kodraden Random skapar en instans av klassen med namnet dice. Den andra kodraden dice.Next(1, 7) använder metoden för att tilldela ett slumpmässigt värde till ett heltal med namnet roll. Observera att anropar-instruktionen innehåller två argument avgränsade med en , symbol. Metoden Next() innehåller en metodsignatur som accepterar två parametrar av typen int. Dessa parametrar används för att konfigurera de nedre och övre gränserna för det slumptal som returneras. Den sista kodraden Console.WriteLine() använder metoden för att skriva ut värdet roll för till -konsolen.
Argumenten som skickas till en metod måste vara samma datatyp som motsvarande parametrar som definieras av metoden. Om du försöker skicka ett felaktigt skrivet argument till en metod fångar C#-kompilatorn ditt misstag och tvingar dig att uppdatera din anropande instruktion innan koden kompileras och körs. Typkontroll är ett sätt som C# och .NET använder för att förhindra att slutanvändare får fel vid körning.
Anmärkning
Även om parametrar ofta används, kräver inte alla metoder parametrar för att slutföra sin uppgift. Klassen innehåller till exempel Console en Console.Clear() metod som inte använder parametrar. Eftersom den här metoden används för att rensa all information som visas i konsolen behöver den inte parametrar för att slutföra uppgiften.
Överlagda metoder
Många metoder i .NET-klassbiblioteket har överlagrade metodsignaturer. Detta gör att du bland annat kan anropa metoden med eller utan argument som anges i anropande instruktion.
En överlagrad metod definieras med flera olika metodsignaturer. Överlagrade metoder ger olika sätt att anropa metoden eller tillhandahålla olika typer av data.
I vissa fall används överlagrade versioner av en metod för att definiera en parameter med olika datatyper. Metoden Console.WriteLine() har till exempel 19 olika överlagrade versioner. De flesta av dessa överlagringar gör att metoden kan acceptera olika typer och sedan skriva den angivna informationen till konsolen. Överväg följande kod:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
I det här exemplet anropar du tre separata överlagrade versioner av metoden WriteLine().
- Den första
WriteLine()metoden använder en metodsignatur som definierar enintparameter. - Den andra
WriteLine()metoden använder en metodsignatur som definierar nollparametrar. - Den tredje
WriteLine()metoden använder en metodsignatur som definierar enstringparameter.
I andra fall definierar överlagrade versioner av en metod ett annat antal parametrar. De alternativa parametrarna kan användas för att ge mer kontroll över önskat resultat. Metoden har till exempel Random.Next() överlagrade versioner som gör att du kan ange olika villkorsnivåer för det slumpmässigt genererade talet.
I följande övning anropas Random.Next() metoden för att generera slumpmässiga heltalsvärden med olika villkorsnivåer:
Kontrollera att du har en tom Program.cs fil öppen i Visual Studio Code.
Om det behövs öppnar du Visual Studio Code och utför sedan följande steg för att förbereda en Program.cs fil i redigeraren:
På menyn Arkiv väljer du Öppna mapp.
Använd dialogrutan Öppna mapp för att navigera till CsharpProjects-mappen och öppna den sedan.
I vyn Visual Studio Code EXPLORER väljer du Program.cs.
På menyn Val i Visual Studio Code väljer du Välj alla och tryck sedan på Delete-tangenten.
Om du vill undersöka de överlagrade versionerna
Random.Next()av metoden anger du följande kod:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");Klicka på Spara på Visual Studio Code-menyn.
Högerklicka på TestProject för att öppna en terminal på mappen TestProject och välj sedan Öppna i integrerad terminal.
Kontrollera att mappsökvägen som visas i kommandotolken pekar på mappen som innehåller din Program.cs fil.
I kommandotolken i Terminal skriver du dotnet run och trycker sedan på Retur för att köra koden.
Observera att resultatet liknar följande utdata:
First roll: 342585470 Second roll: 43 Third roll: 89Talen som genereras är slumpmässiga, så dina resultat blir olika. Det här exemplet visar dock det resultatintervall som du kan se.
Det tar en minut att undersöka koden.
Den första versionen av metoden
Next()anger inte någon övre och undre gräns, så metoden returnerar värden från0till2,147,483,647som är det högsta värde som kan lagras i datatypenint.Den andra versionen av
Next()metoden anger det maximala värdet som en övre gräns, så i det här fallet kan du förvänta dig ett slumpmässigt värde mellan0och100.Den tredje versionen av
Next()metoden anger både lägsta och högsta värden, så i det här fallet kan du förvänta dig ett slumpmässigt värde mellan50och100.Stäng terminalpanelen.
Du har redan gått igenom flera ämnen i den här lektionen. Här är en snabb lista över vad du har gått igenom:
- Du har undersökt hur du använder en metods returvärde (när metoden ger ett returvärde).
- Du har undersökt hur en metod kan använda parametrar som definieras som specifika datatyper.
- Du har undersökt de överlagrade versionerna av vissa metoder som innehåller olika parametrar eller parametertyper.
Använda IntelliSense
Visual Studio Code innehåller IntelliSense-funktioner som drivs av en språktjänst. Till exempel tillhandahåller C#-språktjänsten intelligenta kodslutningar baserat på språksemantik och en analys av källkoden. I det här avsnittet använder du IntelliSense för att implementera Random.Next() metoden.
Eftersom IntelliSense exponeras i kodredigeraren kan du lära dig mycket om en metod utan att lämna kodningsmiljön. IntelliSense innehåller tips och referensinformation i ett popup-fönster under markörens plats när du anger koden. När du skriver kod ändrar popup-fönstret IntelliSense innehållet beroende på kontexten.
När du till exempel anger ordet dice långsamt visar IntelliSense alla C#-nyckelord, identifierare (eller snarare variabelnamn i koden) och klasser i .NET-klassbiblioteket som matchar bokstäverna som anges. Funktioner för automatisk komplettering i kodredigeraren kan användas för att skriva det ord som är den översta matchningen i IntelliSense-popup-fönstret. Prova.
Kontrollera att du har Program.cs filen öppen i Visual Studio Code.
Din app bör innehålla följande kod:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");Längst ned i kodfilen, för att experimentera med IntelliSense, anger du långsamt bokstäverna
dochisedanc.Observera popup-fönstret IntelliSense som visas när du börjar skriva.
När IntelliSense dyker upp bör en lista med förslag visas. När du har angett
dicska identifierarendicevara överst i listan.Tryck på tabbtangenten på tangentbordet.
Observera att hela ordet
dicehar slutförts i redigeraren. Du kan använda upp- och nedpilarna för att ändra markeringen innan du trycker på Tabb-tangenten.Anmärkning
Om IntelliSense-fönstret försvinner kan det väljas med hjälp av tangenten
backspacepå tangentbordet och sedan ange den sista symbolen igen för att öppna IntelliSense igen.Om du vill ange operatorn för medlemsåtkomst anger du ett
.tecken.Observera att IntelliSense-popup-fönstret visas igen när du anger
.och visar en ofiltrerad lista över alla metoder (och andra medlemmar i klassen) som är tillgängliga.Ange N
Listan filtreras och ordet
Nextbör vara den översta markeringen.Om du vill komplettera hela ordet automatiskt trycker du på tabbtangenten.
Ange metodens anropsoperator genom att ange (
Observera att den avslutande parentesen läggs till automatiskt åt dig.
Operatorn för metodanrop är uppsättningen parenteser som finns till höger om metodnamnet. I den här delen av anropande instruktionen anger du de argument som ska skickas till metoden. Metodens anropsoperator krävs när metoden anropas.
Observera att popup-fönstret IntelliSense nu visar detaljerad information om
Random.Next()metoden.Ta en minut att undersöka IntelliSense-popup-fönstret för
Random.Next()metoden.Anmärkning
Om IntelliSense-popup-fönstret stängdes innan du hade en chans att undersöka den tar du bort anropsoperatorn
()och anger sedan ( för att visa IntelliSense-popup-fönstret.Observera att popup-fönstret innehåller tre avsnitt, ett till vänster och två till höger.
På höger sida bör du se
int Random.Next()i det övre avsnittet ochReturns a non-negative random integer.i det nedre avsnittet.intDefinierar returtypen för metoden. Med andra ord returnerar den här versionen av metoden ett värde av typenint.Till vänster i popup-fönstret IntelliSense visas
1/3.1/3Anger att du tittar på den första av tre metodsignaturer förNext()metoden. Observera att den här versionen av metodsignaturen gör det möjligt för metoden att fungera utan parametrar (inga argument skickas till metoden i anropande instruktion).Observera att det också finns en liten pil ovanför och under
1/3.Om du vill undersöka den andra överlagrade versionen av metoden trycker du på nedåtpilen på tangentbordet.
Observera att du kan använda upp- och nedpiltangenterna för att navigera mellan de olika överlagrade versionerna. När du gör det visas
1/3,2/3och3/3visas till vänster i IntelliSense-popup-fönstret och användbara förklaringar till höger.Det tar en minut att undersöka var och en av de överlagrade versionerna
Random.Next()för metoden.Den andra överlagrade versionen av metoden,
2/3, informerar dig om attNext()metoden kan acceptera en parameterint maxValue. Beskrivningen anger att är denmaxValueexklusiva övre gränsen för det tal som du villNext()att metoden ska generera. Exklusivt anger att returnumret är mindre än maxValue. Så när du angerdice.Next(1,7);max tärningskastet blir 6. Observera att meddelandet längst ned i avsnittet har uppdaterats till:Returns a non-negative random integer that is less than the specified maximum.Den tredje versionen av metoden,
3/3, informerar dig om attNext()metoden kan acceptera bådeint minValueochint maxValuesom parametrar. Den nya parametern ,minValueär en lägre gräns för det tal som du villNext()att metoden ska generera. Eftersom den lägre gränsen är inkluderande snarare än exklusiv kan returvärdet vara lika medminValue. Meddelandet längst ned säger nu:Returns a random integer that is within a specified range.I det här fallet tillhandahåller IntelliSense all information som du behöver för att välja lämplig överlagring, inklusive en detaljerad förklaring av
maxValueochminValue. Du kan dock stöta på situationer där du behöver läsa metodens dokumentation.
Använd learn.microsoft.com för information om överlagrade metoder
Det andra sättet att läsa mer om överlagrade versioner av metoder är att läsa i metodens dokumentation. Dokumentationen hjälper dig också att förstå exakt vad varje parameter är avsedd för.
Börja genom att öppna den webbläsare och sökmotor som du föredrar.
Utför en sökning efter C# Random.Next()
Sökningen bör innehålla klassnamnet och metodnamnet. Du kanske också vill inkludera termen
C#för att se till att du inte oavsiktligt får resultat för andra programmeringsspråk.Välj det översta sökresultatet med en URL som börjar med
https://learn.microsoft.com.Ett av de främsta sökresultaten bör leda till en URL som börjar med
https://learn.microsoft.com. I det här fallet bör länkens rubrik visas somRandom.Next Method.Här är länken om du inte lyckas hitta den med hjälp av en sökmotor:
Öppna länken för C# Random.Next().
Sök snabbt igenom dokumentationen.
Rulla nedåt i sidinnehållet för att se de olika kodexemplen. Observera att du kan köra exemplen i webbläsarfönstret.
Dokumentationen learn.microsoft.com följer ett standardformat för varje klass och metod i .NET-klassbiblioteket.
Längst upp på webbsidan letar du reda på avsnittet Med etiketten Överlagringar.
Observera att det finns tre överlagrade versioner av metoden i listan. Varje överlagrade version som visas innehåller en hyperlänk till en plats längre ned på sidan.
Om du vill navigera "på sidan" till en beskrivning av den andra överlagrade versionen väljer du Nästa(Int32).
Dokumentation för varje version av metoden innehåller:
- Kort beskrivning av metodens funktioner
- Metodens definition
- Parametrar som metoden accepterar
- Returnera värden
- Undantag som kan aktiveras
- Exempel på den metod som används
- Andra kommentarer om metoden
Det tar en minut att granska avsnittet Parametrar .
I avsnittet Parametrar kan du läsa att parametern
maxValueär den "exklusiva övre gränsen för det slumpmässiga tal som ska genereras". En exklusiv övre gräns innebär att om du inte vill ha tal som är större än10måste du skicka in värdet11.Du kan också läsa på nästa rad: "
maxValuemåste vara större än eller lika med 0." Vad händer om du ignorerar den här instruktionen? Du kan se i avsnittet Undantag att metoden returnerar ettArgumentOutOfRangeExceptionnärmaxValueär mindre än 0.Anmärkning
Innehållet på learn.microsoft.com är "sanningskällan" för .NET-klassbiblioteket. Det är viktigt att du tar dig tid att läsa dokumentationen för att förstå hur en viss metod fungerar.
Sammanfattning
- Metoderna kan inte acceptera några parametrar eller flera parametrar, beroende på hur de har utformats och implementerats. När du skickar in flera parametrar separerar du dem med en
,symbol. - Metoder kan returnera ett värde när de slutför sin uppgift, eller så returnerar de kanske ingenting (void).
- Överlagrade metoder stöder flera implementeringar av metoden, var och en med en unik metodsignatur (antalet parametrar och datatypen för varje parameter).
- IntelliSense kan hjälpa dig att skriva kod snabbare. Den innehåller en snabb referens till metoder, deras returvärden, deras överlagrade versioner och typerna av parametrar.
- learn.microsoft.com är "sanningskällan" när du vill lära dig hur metoder i .NET-klassbiblioteket fungerar.