Skip to content

Skapa terminalprogram

Vi börjar med att skapa vårt första terminalprogram eller konsol-app (console app) som det kallas i C#. Det är en default-app från dotnet, som skriver ut “Hello, World!” i terminalen.

Vi ställer oss i katalogen kmom01/practice och med dotnet skapar vi vårt första terminalprogram som vi kallar FirstApp. Det tar en liten stund. Katalogen FirstApp kallas C#-projekt eller applikation.

Skapa program med dotnet i katalogen "kmom01/practice"
dotnet new console -n FirstApp

När vi kör appen så kompileras koden och appen byggs. Det tar en stund att kompilera koden. För att köra appen:

Gå ner i katalogen "FirstApp och kör programmet
cd FirstApp
dotnet run
# Ger utskriften: Hello, World!

Vi öppnar vårt terminalprogram i VS Code för att titta på koden. Det är här vi uppdaterar vår kod.

När projektet öppnas första gången i VS Code så kan detta dyka upp i nedre högra hörnet: “Required assets to build and debug are missing. Add them?” Välj i så fall: Yes.

Så här ser filstrukturen ut i vår app.

Image description
Bild: Filstruktur för FirstApp.
  • Program.cs vårt huvudprogram (main) som innehåller vår kod. I det här fallet motsvarar koden bara en utskrift. När du startar ditt terminalprogram med “dotnet run” så körs denna kod.
  • FirstApp.csproj, håller reda på ditt projekt. Den innehåller information om projektets struktur samt vilka filer som ska inkluderas och vilka beroenden projektet har. Filen har samma namn som vårt projekt med “.csproj” på slutet.
  • obj, är en katalog med temporära filer som innehåller filer som skapas under kompileringen
  • bin, innehåller binärfiler, det vill säga den slutgiltiga programkoden som gör att ditt terminalprogram kan köras.

Titta gärna i dokumentationen för mer detaljer om C#. Här är en C# snabbreferens. Du kan gärna titta i snabbreferensen om kodtips men fortsätt skapa appar i terminalen som vi gjorde ovan.

Övning 1 - skriv ut slumptal mellan 1 och 100

Section titled “Övning 1 - skriv ut slumptal mellan 1 och 100”

Vi öppnar vårt huvudprogram, “Program.cs”, i VS Code och byter i koden där till följande kod i slutet:

Byt innehåll till följande i "kmom01/practice/FirstApp/Program.cs"
// Övning 1
// Create random class
Random random = new Random();
// Get random value from 1 (1 included) up to 101 (101 not included)
int number1 = random.Next(1, 101);
int number2 = random.Next(1, 101);
// Present the two random values
Console.WriteLine("\nFirst random value: " + number1);
Console.WriteLine("Second random value: " + number2);

Testkör koden med dotnet run.

Image description
Bild: Resultat från övning 1. Terminalen har rubriken FirstApp.

Vi lägger till en if-sats som skriver ut om personen är myndig eller inte utifrån ålder. För att inte vi ska störas av tidigare kod så rensar vi terminalen och ger den en titel “Min första C# app”. Eftersom inmatning via ReadLine() från användaren kan vara tom, så lägger vi till ett defaultvärde som i det här fallet är “1”.

Vi lägger till följande kod i slutet vårt huvudprogram, “Program.cs”:

Lägg till följande i "kmom01/practice/FirstApp/Program.cs"
// Övning 2
// Clean console och sätt titel
Console.Clear();
Console.Title = "Min första C# app";
// Input
Console.WriteLine("\nVilken är din ålder?");
string input = Console.ReadLine() ?? "1"; // input får defaultvärdet "1" om inget matas in
int age = int.Parse(input);
// Check age
string message;
if (age < 18)
{
message = "Du är inte myndig";
}
else
{
message = "Grattis - du är myndig";
}
// Present the result
Console.WriteLine("\n" + message);

Testkör koden med dotnet run.

Nu har vi rensat terminalen, så “Hello, world!” och slumptalen syns inte längre. Vi har lagt till en titel på vårt terminalfönster. Så här ser det ut från en Mac:

Image description
Bild: Resultat från övning 2.

Testkör programmet igen och ange då en ålder under 18 för att verifiera den delen av if-satsen.

Nu ska vi göra en funktion som innehåller vår if-sats för att kunna använda den kodsnutten flera gånger. Metoden ska returnera en sträng. Inmatningen är samma som innan men vi flyttar vår if-sats till en metod. Vi gör också en metod av kommandona till terminalen.

OBS Om du vill ha kvar koden för övning 2 i “Program.cs” så går det bra men eftersom input och age redan är deklarerade då så får du ta bort datatypen framför.

Omarbeta övning 2 till funktioner i "kmom01/practice/FirstApp/Program.cs"
// Övning 3
// Methods
static void GetTerminalReady(string title)
{
Console.Clear();
Console.Title = title;
}
static string CheckIfAdult(int age)
{
if (age < 18)
{
return "Du är inte myndig";
}
else
{
return "Grattis - du är myndig";
}
}
// Input
GetTerminalReady("Min första C# app");
Console.WriteLine("\nVilken är din ålder?");
string input = Console.ReadLine() ?? "1"; // ta bort string om input redan är deklarerad
int age = int.Parse(input); // ta bort int om age redan är deklarerad
// Call method
string message = CheckIfAdult(age); // ta bort string om message redan är deklarerad
// Present the result
Console.WriteLine("\n" + message);

Resultatet ska bli detsamma som i föregående övning men nu med metoder.

Nu fortsätter vi att utforska C# med interpolerande strängar. Vi deklarerar en variabel för namn och en variabel för ålder vilka vi initierar och skriver ut. Därefter anropar vi metoden vi skrev ovan, CheckIfAdult, och skriver ut det i en interpolerande sträng.

Lägg till följande i "kmom01/practice/FirstApp/Program.cs"
// Övning 4
// String interpolation
string firstName = "Murphy";
int noOfPets = 2;
string info = $"Du heter {firstName} och har {noOfPets} husdjur.";
Console.WriteLine("\n" + info);
noOfPets = 4;
Console.WriteLine(info);
Console.WriteLine($"Antalet djur är nu: {noOfPets}");

Om noOfPets ändras efter interpolationen i tilldelningen av info, så påverkas inte innehållet i info utan info har samma innehåll som vid initieringen.

Testkör koden med dotnet run.

Så här ser det ut från en Mac:

Image description
Bild: Resultat från övning 4.

I nyare versioner av C# finns tuples. Vi deklarerar en ny variabel infoTuple som är en tuple med en sträng och ett heltal. Vi använder firstName och noOfPets från förra övningen och kopierar deras värden till tupeln och skriver sedan ut tupeln. Om vi vill komma åt första värdet i en tuple så använder vi Item1, för andra värdet Item2 och så vidare. OBS indexeringen börjar på 1 i tuples, till skillnad från index 0 i till exempel strängar, arrayer och listor.

Lägg till följande i "kmom01/practice/FirstApp/Program.cs"
// Övning 5
// Tuples
(string, int) infoTuple = (firstName, noOfPets);
Console.WriteLine($"\n{infoTuple}");
Console.WriteLine($"{infoTuple.Item2}");

Testkör koden med dotnet run.

Så här ser det ut från en Mac:

Image description
Bild: Resultat från övning 5.

I den här övningen ska vi träna på att omvandla mellan olika typer. Försök utföra följande typomvandlingar:

  • omvandla 123 (int) till en float med implicit casting
  • omvandla 123.123 (double) till en int med explicit casting
  • omvandla double 123.123 till en sträng med klassen Convert
  • omvandla “Hej” till en int med klassen Convert. Testa utan try-catch först.
  • omvandla “Hej” till ett tal med int.TryParse
  • omvandla “123” till ett tal med int.TryParse
Lägg till följande i "kmom01/practice/FirstApp/Program.cs"
// Övning 6
// Cast and convert
int intNo = 123;
float floatNo = intNo;
Console.WriteLine($"\n{floatNo}");
Console.WriteLine($"{floatNo:F1}"); // skriv ut med en decimal
double doubleNo = 123.123;
int intNo2 = (int)doubleNo;
Console.WriteLine($"\n{intNo2}");
Console.WriteLine($"\n{Convert.ToString(doubleNo)}");
string hi = "Hej";
try
{
Console.WriteLine($"\n{Convert.ToInt32(hi)}");
} catch (Exception error)
{
Console.WriteLine($"\nDet gick inte att konvertera {hi} med klassen Convert och ToInt32.");
Console.WriteLine(error.Message);
}
int number;
bool success = int.TryParse(hi, out number);
Console.WriteLine($"\n{success} och numret blev {number}");
string strNo = "123";
bool success2 = int.TryParse(strNo, out number);
Console.WriteLine($"\n{success2} och numret blev {number}");

Testkör koden med dotnet run. Testkör gärna efter varje omvandling.

Så här ser det ut när allt är klart:

Image description
Bild: Resultat från övning 6.

Vi kan formatera koden med verktyget dotnet format som formaterar enligt en standarduppsättning. Verktyget hjälper till att standardisera kodstilen och göra den konsekvent. Stå i rotkatalogen till ett C#-projektet och kör kommandot i terminalen:

Terminal window
dotnet format
dotnet format -v d // ger mer info om formateringen

Läs mer om dotnet format.

Efter som “C# Dev Kit extension” är installerad, så förenklar det debuggning.

På Mac och Linux fungerar det enligt bilden nedan. Klicka först (1) på “SOLUTION EXPLORER” och därefter (2) så markerar du “FirstApp”. Högerklicka på “FirstApp” och följande meny dyker upp med (3) debug som alternativ längst ner. Starta (4) debuggern genom att välja “Start New Instance”.

Se bild nedan:

Image description
Bild: Starta debuggning i VS Code (Mac och Linux).

Markera (1) “Program.cs” och klicka på “F5”. Funkar inte det så väljer du (2) “Run” i menyn följt av “Start Debugging”.

Image description
Bild: Starta debuggning i VS Code (WSL2/Windows).

Efter en liten stund så ser det ut så som bilden nedan. För att mata in värden (1) så gör du det längst ner och trycker ENTER när du är klar, precis som i terminalen. Längst upp (2) kan du styra debuggningen.

Image description
Bild: Mata in värde och kör vidare i debuggningen.

Så här ser verktygsfältet med debugkommandona ut i VS Code.

Image description
Bild: VS Code verktygsfält för debuggning.

Debugkommandona:

  1. Kör/Fortsätt (Continue/Pause); Startar eller fortsätter exekveringen tills nästa breakpoint.
  2. Stega över (Step Over); Kör nästa rad utan att gå in i metod/funktion.
  3. Stega in (Step Into); Går in i nästa metod/funktion.
  4. Stega ut (Step Out); Kör klart aktuell metod och återgår till anropande kod.
  5. Starta om (Restart); Stoppar och startar om debug-sessionen.
  6. Stoppa (Stop); Avslutar debug-sessionen.

Sätt brytpunkter genom att markerar till vänster om radnumret och då blir det en röd punkt där. Jag har markerat rad 97 här och debuggern har stoppat på den raden.

Image description
Bild: Visa en brytpunkt i VS Code.

Om du vill läsa mer, se manualen till VS Code Debugging.

Toppen, nu har vi lärt oss:

  • skapa och köra vårt första C#-projekt (applikation, terminalprogram)
  • lärt oss lite om filstrukturen i projektet
  • koda in- och utmatning
  • koda slumptal
  • koda if-satser
  • koda metoder
  • hur vi enkelt kan formatera koden med kommandot “dotnet format”
  • debugga vår kod