Oefening: Codeblokken en variabelebereik
- 11 minuten
Een codeblok bestaat uit een of meer C#-instructies voor het definiëren van een uitvoeringspad. De instructies buiten een codeblok zijn van invloed op wanneer, indien en hoe vaak dat codeblok tijdens runtime wordt uitgevoerd. De grenzen van een codeblok worden meestal gedefinieerd door golvende accolades, {}.
Naast hun effect op het uitvoeringspad, kunnen codeblokken ook van invloed zijn op het bereik van uw variabelen. De codevoorbeelden die u tijdens deze oefening bekijkt, helpen u inzicht te krijgen in de relatie tussen codeblokken en het bereik van variabelen.
Codeblokken beïnvloeden het bereik van een variabeledeclaratie
Het bereik van een variabele verwijst naar de zichtbaarheid van een variabele voor de andere code in uw toepassing. Een variabele met lokaal bereik is alleen toegankelijk in het codeblok waarin deze is gedefinieerd. Als u buiten het codeblok probeert toegang te krijgen tot de variabele, wordt een compilerfout geretourneerd.
In de rest van deze eenheid wordt de relatie tussen codeblokken en het bereik van variabelen verkend.
Uw coderingsomgeving voorbereiden
Deze module bevat praktische activiteiten die u begeleiden bij het bouwen en uitvoeren van demonstratiecode. U wordt aangeraden deze activiteiten uit te voeren met Behulp van Visual Studio Code als uw ontwikkelomgeving. Het gebruik van Visual Studio Code voor deze activiteiten helpt u om comfortabeler code te schrijven en uit te voeren in een ontwikkelomgeving die wordt gebruikt door professionals wereldwijd.
Open Visual Studio Code.
U kunt de Windows-Startmenu (of een equivalente resource voor een ander besturingssysteem) gebruiken om Visual Studio Code te openen.
Selecteer Map openen in het menu Visual Studio Code-bestand.
Navigeer in het dialoogvenster Map openen naar de map Windows-bureaublad.
Als u een andere maplocatie hebt waar u codeprojecten bewaart, kunt u die maplocatie gebruiken. Voor deze training is het belangrijk om een locatie te hebben die gemakkelijk te vinden en te onthouden is.
Selecteer Map selecteren in het dialoogvenster Map openen.
Als u een beveiligingsdialoogvenster ziet waarin u wordt gevraagd of u de auteurs vertrouwt, selecteert u Ja.
Selecteer In het menu Visual Studio Code Terminal de optie Nieuwe terminal.
U ziet dat in een opdrachtprompt in het terminalvenster het mappad voor de huidige map wordt weergegeven. Bijvoorbeeld:
C:\Users\someuser\Desktop>Notitie
Als u op uw eigen pc werkt in plaats van in een sandbox of gehoste omgeving en u andere Microsoft Learn-modules in deze C#-serie hebt voltooid, hebt u mogelijk al een projectmap gemaakt voor codevoorbeelden. Als dat het geval is, kunt u de volgende stap overslaan, die wordt gebruikt om een console-app te maken in de map TestProject.
Voer bij de terminalopdrachtprompt de volgende prompt in om een nieuwe consoletoepassing in een opgegeven map te maken:
dotnet new console -o ./CsharpProjects/TestProjectDeze .NET CLI-opdracht maakt gebruik van een .NET-programmasjabloon om een nieuw C#-consoletoepassingsproject te maken op de opgegeven maplocatie. Met de opdracht worden de mappen CsharpProjects en TestProject voor u gemaakt en wordt TestProject gebruikt als de naam van uw
.csprojbestand.Als er een bericht wordt weergegeven waarin wordt aangegeven dat de bestanden al bestaan, gaat u verder met de volgende stappen. U gebruikt de bestaande projectbestanden opnieuw.
Vouw in de EXPLORER-weergave de map CsharpProjects uit .
U ziet de map TestProject en twee bestanden, een C#-programmabestand met de naam Program.cs en een C#-projectbestand met de naam TestProject.csproj.
Selecteer Map openen in het menu Visual Studio Code-bestand.
Selecteer in het dialoogvenster Map openen de map CsharpProjects en klik vervolgens op Map selecteren.
Vouw in de explorer-weergave de map TestProject uit en selecteer Program.cs.
Verwijder de bestaande coderegels.
U gebruikt dit C#-consoleproject om codevoorbeelden te maken, te bouwen en uit te voeren tijdens deze module.
Sluit het deelvenster Terminal.
Een variabele maken in een codeblok
U begint met het bekijken van het geval wanneer een variabele wordt geïnitialiseerd in een codeblok.
Zorg ervoor dat Visual Studio Code is geopend en Program.cs weergegeven in het deelvenster Editor.
Notitie
Program.cs moet leeg zijn. Als dat niet het is, selecteert en verwijdert u alle coderegels.
Typ de volgende code in de Visual Studio Code-editor:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); }Selecteer Opslaan in het menu Visual Studio Code File.
Het Program.cs-bestand moet worden opgeslagen voordat u de code bouwt of uitvoert.
Klik in het deelvenster EXPLORER om een Terminal te openen op de locatie van de map TestProject met de rechtermuisknop op TestProject en selecteer Vervolgens Openen in geïntegreerde terminal.
Er wordt een terminalvenster geopend. De Terminal moet een opdrachtprompt bevatten waarin wordt aangegeven dat de terminal is geopend voor de locatie van de map TestProject.
Typ dotnet-run bij de Terminal-opdrachtprompt en druk op Enter om uw code uit te voeren.
Notitie
Als er een bericht wordt weergegeven met de tekst 'Kan een project niet vinden om uit te voeren', controleert u of in de Terminal-opdrachtprompt de verwachte locatie van de testprojectmap wordt weergegeven. Bijvoorbeeld:
C:\Users\someuser\Desktop\csharpprojects\TestProject>U moet de volgende uitvoer zien:
Inside the code block: 10
Dit is de verwachte uitvoer. Maar wat moet u doen als u toegang wilt krijgen tot de variabele value buiten het codeblok van de if instructie?
Probeer toegang te krijgen tot een variabele buiten het codeblok waarin deze is gedeclareerd
Maak in de Visual Studio Code-editor een nieuwe coderegel onder het codeblok van de
ifinstructie.Voeg op de lege coderegel die u hebt gemaakt de volgende coderegel toe:
Console.WriteLine($"Outside the code block: {value}");Controleer of de bijgewerkte code er als volgt uitziet:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); } Console.WriteLine($"Outside the code block: {value}");Sla uw codebestand op en gebruik Visual Studio Code om uw code uit te voeren.
Voer
dotnet runvanaf de Terminal-opdrachtprompt in om uw code uit te voeren.Wanneer u de toepassing probeert uit te voeren, krijgt u een compilatiefout:
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
Het Program.cs(7,46) gedeelte van het bericht geeft aan dat de fout is gekoppeld aan regel 7 in het bestand Program.cs, kolom 46.
Deze fout wordt gegenereerd omdat een variabele die in een codeblok wordt gedeclareerd, alleen toegankelijk is (alleen zichtbaar) in dat codeblok. Omdat een variabele niet kan worden geopend buiten het codeblok waarin deze is gedeclareerd, value kan deze niet worden geopend vanaf regel 7 van uw code.
Een variabele die in een methodecodeblok wordt gedeclareerd, wordt een lokale variabele genoemd. Mogelijk ziet u de lokale termvariabele die wordt gebruikt bij het bekijken van artikelen waarin het bereik van variabelen wordt besproken.
De variabeledeclaratie boven het codeblok verplaatsen
Als u toegang wilt krijgen tot een variabele zowel binnen als buiten een codeblok, moet u de variabele declareren vóór (boven) het codeblok, zodat de code buiten het codeblok de variabele kan zien.
Werk uw code als volgt bij in de Visual Studio Code-editor:
bool flag = true; int value; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");Neem even de tijd om de updates te bekijken.
U ziet dat
valuenu buiten hetifcodeblok is gedeclareerd (maar niet geïnitialiseerd).Gebruik Visual Studio Code om uw updates op te slaan en voer vervolgens uw code uit.
U ziet dat u nog steeds een compilatiefout krijgt.
Wanneer u de toepassing probeert uit te voeren, krijgt u deze keer de volgende compilatiefout:
Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'De fout is gekoppeld aan regel 6 in het codeblok omdat
valueer geen geïnitialiseerde waarde is toegewezen (er is geen waarde aan toegewezen). Als de coderegelvalue = 10;zich boven het codeblok van deifinstructie bevindt, zou de toepassing correct worden gecompileerd en zou alles goed zijn. Omdatvaluedeze echter niet is geïnitialiseerd, kan deze niet worden geopend in het codeblok.Als u ervoor zorgt dat uw variabelen worden geïnitialiseerd voordat u toegang probeert te krijgen, wordt dit probleem opgelost.
Een variabele initialiseren als onderdeel van de declaratie van variabelen
Als u wilt initialiseren
valueals onderdeel van de variabeledeclaratie, werkt u uw code als volgt bij:bool flag = true; int value = 0; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");Met deze code wordt de compilatiefout 'Niet-toegewezen lokale variabele' opgelost door te initialiseren
valueals onderdeel van uw variabeledeclaratie.Gebruik Visual Studio Code om uw code op te slaan en uit te voeren.
Wanneer u de toepassing uitvoert, ziet u nu de volgende uitvoer:
Inside the code block: 0 Outside the code block: 10
De interpretatie van de compiler van uw code onderzoeken
Om runtimefouten te voorkomen, analyseert de C#-compiler uw code in de Visual Studio Code-editor en tijdens het buildproces. De compiler interpreteert uw code echter niet altijd op dezelfde manier als u doet.
Houd rekening met de volgende twee codevoorbeelden die hetzelfde doel lijken te hebben:
// Code sample 1
bool flag = true;
int value;
if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;
if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
Het kan zijn dat deze twee voorbeelden altijd hetzelfde resultaat moeten opleveren, maar de C#-compiler interpreteert deze twee codevoorbeelden anders.
Voor het eerste codevoorbeeld interpreteert flag de compiler als een Booleaanse variabele die een waarde van een true van beide of falsekan worden toegewezen. De compiler concludeert dat als flag dat het is false, value niet wordt geïnitialiseerd wanneer de tweede Console.WriteLine() wordt uitgevoerd. De compiler beschouwt in wezen de volgende twee paden voor het uitvoeren van code:
// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
EN
// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");
Omdat de compiler het tweede pad beschouwt als een mogelijkheid (voor codevoorbeeld 1), wordt er een foutbericht gegenereerd tijdens het buildproces. Bovendien waarschuwt de code-editor in Visual Studio Code u voor dit probleem door een rode golvende lijn onder value (onder het codeblok) weer te geven.
Voor het tweede codevoorbeeld eindigt de complier dat de inhoud van het if instructiecodeblok altijd wordt uitgevoerd (true is altijd true). De compiler genereert geen buildfout omdat het tweede codevoorbeeld als volgt wordt geïnterpreteerd als volgt een enkel uitvoeringspad:
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
Samenvatting
Hier volgen enkele belangrijke zaken die u moet onthouden over codeblokken:
- Wanneer u een variabele in een codeblok declareert, is de zichtbaarheid lokaal voor dat codeblok en kan die variabele niet worden geopend buiten het codeblok.
- Om ervoor te zorgen dat een variabele zowel binnen als buiten een codeblok zichtbaar is, moet u de variabele declareren vóór het codeblok (buiten en boven het codeblok).
- Zorg ervoor dat variabelen worden geïnitialiseerd voordat uw code toegang probeert te krijgen (voor alle mogelijke paden voor het uitvoeren van code).