Artikel top billede

(Foto: Computerworld)

Tag skridtet videre i et af verdens bedste kodesprog

År efter år placerer Microsofts programmeringssprog C# sig som et af de allermest populære og udbredte. Her følger vi op på introduktionen og løfter sløret for flere af de funktioner i C#, som du kan bruge til at skabe dine helt egne programmer og funktioner.

Af Michell Cronberg, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Læs introduktionen her.

Microsofts programmeringssprog C# ligger som regel i top-5 målt på brug og popularitet – det viser en række undersøgelser år for år. Så det er godt at kunne. Så meget desto mere, som at du kan skabe en masse spændende funktioner og programmer med C#.

I nummer 5 beskrev vi, hvordan du nemt kommer i gang med at skrive kode i C#. Du blev introduceret til udviklingsmiljøet, programmering på .NET-platformen, brug af variabler, flow-instruktioner, metoder og meget mere.

Fik du appetit på at gå videre? Så skal du læse denne artikel, hvor vi sætter fokus på især objektorienteret programmering, der er en af de måder at skrive kode, som understøttes af de fleste store programmeringssprog – herunder også C#.

Før du kan gå i gang med at skrive applikationer i den helt grundlæggende form for programmering, mangler vi at dække samlinger af data. Alle programmeringssprog indeholder muligheden for at skabe en samling af relaterede variabler. Se eksempelvis koden i eksempel 1.

Her erklæres tre variabler, som tildeles en værdi dækkende temperaturer for tre måneder. Herefter lægges værdierne sammen, og der beregnes et gennemsnit.

Eksempel 1: Tre værdier lægges sammen, og der vises et gennemsnit.

Håndtering af mange værdier

Koden er som sådan fin, men som det fremgår, bliver det kompliceret, når der skal regnes på flere måneder, fordi der både skal skabes nye variabler, og beregningen af både sum og gennemsnit skal tilrettes.

Da variablerne, der indeholder temperatur, er relaterede til hinanden, er det meget bedre at benytte en indbygget datastruktur, der kan håndtere mange værdier. Der er mange forskellige typer, nogle er mere statiske end andre, men den klassiske struktur kaldes et array (som direkte kan oversættes til ”række”).

Eksempel 2: Data tilgås gennem et indeks ved hjælp af firkantede parenteser.

Her kan data placeres i en indeksbaseret struktur – se eksempel 2. Nu kan data tilgås gennem et indeks ved hjælp af firkantede parenteser (eksempelvis ”temp[1]”, som vil have værdien 12.3), og der er en masse indbyggede metoder i platformen til blandt andet at beregne gennemsnit, sum, mindste værdi, største værdi med videre.

Forskellige typer

Der findes mange andre typer af datastrukturer, som er indbygget i .NET – herunder køer, stakke, lister og mange andre. Et klassisk array er typisk brugt, når der er tale om faste størrelser som eksempelvis tolv værdier dækkende måneder på et år. Hvis det bliver for dynamisk, er andre samlinger (kaldet collections) meget bedre.

Alle de variabeltyper, der er nævnt i denne og forrige artikel, er skabt af Microsoft og er en del af .NET-platformen. Således kunne et heltal være af typen Int32, et kommatal være af typen Double, en dato af typen DateOnly og så videre.

En type kan du således se som en skabelon for, hvor meget en datastruktur fylder i hukommelsen samt for den tilhørende funktionalitet.

Brug af klasser

Et eksempel kunne være en variabel af typen DateOnly – se illustrationen Eksempel 3. Den fylder et givet antal bytes i hukommelsen og indeholder metoder som eksempelvis Add­Days, som gør det nemt at foretage beregninger.

Selve .NET-platformen består af tusinder af typer skabt af Microsoft for at gøre det nemt at skrive kode, og du kan forvente, at næsten al generisk funktionalitet allerede er i platformen – du skal bare finde den. Her er især Google din ven. Søg eksempelvis efter ”C# random number”, og du vil ende med eksempler på brug af typen System.Random.

Eksempel 3: Her er et eksempel på en variabel af typen DateOnly.

Men der er typer, som Microsoft naturligvis ikke kender til; typer, som er en del af din applikation, og som gør det nemt for dig at skrive kode. I deres helt simple form kan du se dem som sammensatte variabeltyper. Se eksempel 4, hvor der gemmes information om en person i enkelte variabler.

Eksempel 4: Her gemmes information om en person i
enkelte variabler.

Det bliver hurtigt alt for uoverskueligt, hvis der er for mange variabler. Bedre er det at erklære en ny type Person (eksempel 5) og så gemme værdier i nye instanser (eksempel 6).

Du kan erklære typer som klasser (class) eller strukturer (struct), og forskellen handler om, hvor værdier placeres i hukommelsen, og hvorvidt man ønsker at udnytte features relateret til objektorienteret programmering som eksempelvis nedarvning. Det berører vi dog ikke i denne artikel.

Eksempel 5: Det er her bedre at erklære en ny type Person.
Eksempel 6: Derefter kan man gemme værdier i nye instanser.

Eksempel på en klasse

Som et eksempel på udvikling af en type kan du forestille dig, at du skal udvikle et spil med terninger – Yatzy eller lignende.

Til det brug kunne det være smart at udvikle en type kaldet Terning, som indeholder al den funktionalitet, du skal bruge. Så er det nemt for dig (og andre) at benytte terningen. Det kaldes for abstraktion i objektorienteret programmering.

Prøv at se eksempel 7, hvor klassen Terning er defineret. Den indeholder private og offentlige medlemmer, og de, som benytter terningen i kode, kan kun se de offentlige. Det kaldes for indkapsling og gør det muligt at gemme funktionalitet væk for blandt andet at gøre terningen så nem at bruge som muligt.

Eksempel 7: I gang med Yatzy. Klassen Terning er defineret.

Som du kan se, består Terning af en privat værdi, som kan tildeles en tilfældig værdi gennem Ryst-metoden. Terningen har samtidig metoder kaldet HentVærdi samt Skriv, og en speciel metode kaldet en konstruktør, som afvikles, når der skabes en instans af terningen. På den måde får terningen en tilfældig værdi, når den bliver oprettet.

Du kan se, hvordan terningen kan bruges, i eksempel 8, og bemærk, hvor simpelt og effektivt det er at arbejde med en terning, når alt er defineret i en separat type. Udvikleren, som benytter terningen, behøver ikke forstå, hvordan den fungerer, og skal blot tage stilling til de offentlige medlemmer i klassen.

Eksempel 8: Her kan du se, hvordan terningen kan bruges.

Koden kan du finde på AODs GitHub-konto, og du kan finde en video på YouTube, som viser, hvordan du hurtigt kan skabe en applikation og prøve at lege med terningen.

Skriv en Yatzy-kode

Hvis du har lyst, kan du på AODs Github-konto finde en yderligere klasse kaldet Bæger. Den består af fem instanser af klassen Terning i et array og kan fungere som et yatzy-bæger med relaterede metoder. Du kan også finde et par kode-udfordringer.

Hvad med at skrive koden til, om der er yatzy, tre ens, to par med videre? Der er naturligvis en løsning, du kan lure i, hvis du har lyst. God fornøjelse!