Dagens statistik

Gennemførte øvelser
-
Indtastede tegn Indskrevne ord
-
Øvelsestid
-

Samlet statistik

Gennemførte øvelser
-
Indtastede tegn Indskrevne ord
-
Øvelsestid
-

Lektion i tifingersystemet: Programmering i sproget C#

Tifingersystemet er vigtigt i programmering. Du er mere effektiv, når du bruger hurtige skriveteknikker til at skrive kode i programmeringssproget C#.

Lad os lære mere om sproget C# og tifingersystemet, når vi programmerer i C#.

Programmering i C# og tifingersystemet

C# er gået fra primært at være forbundet med Windows-skrivebordsapps til at være et alsidigt, multiparadigmatisk sprog på tværs af platforme og domæner. I dag er det kernen i .NET og driver webapplikationer, API'er, desktopprogrammer, mobilapps, spilmotorer som Unity og cloud-native mikrotjenester. Designfilosofien vægter læsbarhed, produktivitet og tæt værktøjsintegration. Samtidig rummer C#'s syntaks en blanding af nøgleord, symboler og konventioner, der kræver præcision. Derfor er blindskrivning i C# ikke kun komfort - det forebygger subtile fejl i generics eng.: generics - typeparametre, attributter, nullability, lambda-udtryk og LINQ-forespørgsler. Hurtig tastning i C# gør det mindre tidskrævende at skrive og redigere kode under refaktorering, især lange deklarationer med mange symboler. Koden skal stadig kontrolleres, og kompileringsfejl skal rettes.

Konventioner og idiomatisk C#

Idiomatisk C# har et tydeligt præg: klasser, structs og enums skrives i PascalCase; metoder og egenskaber (properties) ligeledes i PascalCase; lokale variabler og parametre i camelCase. Private felter har ofte foranstillet understregning, f.eks. _value. Konstanter skrives typisk i PascalCase, selv om enkelte teams foretrækker STORE_BOGSTAVER. Interfaces begynder med I, f.eks. IEnumerable, IDisposable. Den konsekvente stil øger læsbarheden, men betyder også, at man ofte skriver lange, beskrivende identifikatorer. Her betaler blindskrivning i C# sig: når navne som GetCustomerInvoicesAsync sidder på rygraden, kan opmærksomheden forblive på logikken. Sammen med hurtig tastning i C# bliver de gentagne mønstre og lange navne ikke en hæmsko.

Using-direktiver, navnerum og kodeorganisering

En typisk C#-fil begynder med using-direktiver - globale eller fil-lokale - efterfulgt af et navnerum. Moderne C# tillader file-scoped navnerum, hvilket mindsker indrykning. Alligevel kræver sammensatte navne som System.Collections.Generic fuldstændig præcision med punktummer og semikoloner. Regelmæssig blindskrivning i C# gør disse sekvenser automatiske, og hurtig tastning i C# gør omrokering af imports ubesværet.

namespace Demo.Utilities;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

Typer: klasser, structs og records

C# tilbyder klasser (reference-semantik), structs (værdi-semantik) og records eng.: record - kompakt datatype med værdibaseret lighed. Records giver korte deklarationer, men er afhængige af parenteser og kommaer. Structs benytter ofte modifikatorer som readonly, ref eller unsafe, som skal skrives nøjagtigt. Ingen af delene er i sig selv svære, men en manglende parentes eller semikolon stopper kompileringen. Blindskrivning i C# indøver korrekt placering af symboler; hurtig tastning i C# gør det hurtigt at udvide en kort record til en fuld klasse med konstruktører og egenskaber.

public record Invoice(Guid Id, string Customer, decimal Total);

public readonly struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) { X = x; Y = y; }
}

Egenskaber og udtryksskabte medlemmer

Egenskaber er kernen i idiomatisk C#. Ud over auto-properties har vi init-only setters og udtryksskabte medlemmer (enkeltlinjede medlemmer med pil). Koden bliver kort, men kræver præcis indtastning; operatoren => optræder ofte. Fast, sikker blindskrivning i C# minimerer pauserne for at finde tasterne, og hurtig tastning i C# gør det hurtigt at skrive mange ensartede egenskaber.

public class Account
{
    public decimal Balance { get; private set; }
    public void Deposit(decimal amount) => Balance += amount;
}

Generics og constraints

Generics (typeparametre) giver typesikkerhed i samlinger og algoritmer. Syntaks som List<T>, Dictionary<TKey,TValue> og where-constraints er kompakte, men symbolske. Forkerte vinkelparenteser er en klassisk fælde. Indlejrede generics - f.eks. Dictionary<string, List<int>> - øger risikoen. Vedholdende blindskrivning i C# opbygger refleksen for at parre < og > rigtigt; hurtig tastning i C# gør ændringer i constraints friktionsfrie.

public class Repository<T> where T : class, new()
{
    private readonly List<T> _items = new();
    public void Add(T item) => _items.Add(item);
    public IEnumerable<T> All() => _items;
}

Overloading, operatorer og indexere

Overloading eng.: overloading - flere metoder med samme navn, men forskellige signaturer - er almindeligt i C#. Sproget understøtter også operator-overloading samt indexere eng.: indexer - egenskaber der giver array-lignende adgang. Syntaksen er kort, men uforsonlig: nøgleordet operator, pilen og parenteserne skal være rigtige. Blindskrivning i C# reducerer tastefejl; hurtig tastning i C# gør det let at tilføje flere overloads.

public readonly record struct Point(int X, int Y)
{
    public static Point operator +(Point a, Point b) => new(a.X + b.X, a.Y + b.Y);
}

Lambdas, delegater og events

Delegater eng.: delegates - typesikre funktionssignaturer og events er grundlæggende i C#'s hændelsesmodel. Lambdas bruges til anonyme funktioner. Man taster =>, parenteser og ofte null-operatorer igen og igen; en enkelt forkert tast, f.eks. et minus i stedet for et lighedstegn, bryder buildet. Konsistent blindskrivning i C# gør sekvenserne refleksive, og hurtig tastning i C# gør event-tilkoblinger og små inline-funktioner hurtige at skrive.

public event Action? Updated;
public void Raise() => Updated?.Invoke();
var square = (int x) => x * x;

LINQ og flydende syntaks

LINQ (forespørgselsoperatorer over objekter) er et kendetegn ved C#. Det udtrykker transformationer som kæder af metodekald eller forespørgselssyntaks. Det kræver sikker brug af punktummer, parenteser og pile. Blindskrivning i C# holder rytmen i de symbolske kæder; hurtig tastning i C# gør det nemt at eksperimentere og omarrangere uden at miste fokus.

var results = orders.Where(o => o.Total > 100)
                    .Select(o => o.Customer)
                    .OrderBy(n => n)
                    .ToList();

Asynkron programmering med async/await

Nøgleordene async og await har gjort asynkronitet udtryksfuld, men kræver disciplin: kode med et manglende await kan ofte kompileres, men opføre sig anderledes end tilsigtet. Signaturer som Task<T> blander vinkelparenteser og generics. Blindskrivning i C# fastholder præcisionen; hurtig tastning i C# gør signaturændringer og cancellation tokens naturlige at arbejde med.

static async Task<string> FetchAsync(HttpClient http, string url)
{
    using var resp = await http.GetAsync(url);
    return await resp.Content.ReadAsStringAsync();
}

Pattern matching og switch-udtryk

Pattern matching eng.: pattern matching - at beskrive datastruktur og type i betingelser komprimerer logik i kompakte former. Switch-udtryk, relationelle og logiske mønstre samt property-mønstre reducerer støj, men forudsætter præcis brug af pile, parenteser og underscores. Når du øver blindskrivning i C#, træner du præcis indtastning af disse konstruktioner; hurtig tastning i C# gør det hurtigt at prøve alternative grene.

static string Describe(object? x) => x switch
{
    null => "null",
    int n and >= 0 => "non-negative",
    string s and { Length: > 3 } => "string",
    _ => "other"
};

Nullability og defensiv stil

Nullbare reference-typer eng.: nullability - at angive muligheden for null på typeniveau skærper disciplinen ved kompilering. Operatorerne ?, ?? og ?. bruges ofte - deres forveksling giver advarsler eller undtagelser. Struktureret blindskrivning i C# mindsker fejlene, og hurtig tastning i C# gør det hurtigt at annotere større kodebaser.

public string Normalize(string? input)
{
    return (input?.Trim() ?? string.Empty).ToUpperInvariant();
}

Attributter og metadata

Attributter (metadata knyttet til koden) er allestedsnærværende: fra forældelsesmarkering til serialiseringskonfiguration. De bruger altid kantede parenteser og har ofte parametre. En manglende parentes stopper buildet. Øvelser i blindskrivning i C# giver træning i at indtaste attributterne korrekt; hurtig tastning i C# gør det let at anvende attributter på tværs af filer.

[Obsolete("Use NewApi")]
public void OldMethod() { }

Strenge og formatering

C# understøtter strenginterpolation $"", verbatim-litteraler @"" og rå litteraler """. Interpolation betyder at indsætte værdier i strengen via { ... }. De sparer tid, men kræver årvågenhed med anførselstegn, klammer og præfikser. Blindskrivning i C# hjælper med korrektheden; hurtig tastning i C# gør lange beskeder og JSON-indsatser ligetil.

var msg = $"Hello {name}, today is {DateTime.Now:yyyy-MM-dd}";
var path = @"C:\logs\app.log";
var json = """
{ "status": "ok", "active": true }
""";

Ranges, indexere og spans

Range-operatoren .. og end-indeks ^ giver kompakte udsnit, mens Span<T>/ReadOnlySpan<T> (arbejde på sammenhængende hukommelsesblokke uden kopier) giver ydeevne uden pointer-syntaks. De ser små ud, men kræver absolut præcision - et enkelt forkert caret ændrer betydningen. Gentaget blindskrivning i C# gør symbolerne naturlige; hurtig tastning i C# gør hyppig brug uden tempo-tab mulig.

var middle = numbers[1..^1];

Dokumentation og analysatorer

XML-kommentarer starter med /// og bruger tags som <summary> og <param>. Analysatorer eng.: analyzers - regler for statisk kodeanalyse hjælper med stil og kvalitet. Der er mange tegn at holde styr på, og det er let at lave tastefejl. Systematisk blindskrivning i C# gør de tre skråstreger og tags flydende; hurtig tastning i C# mindsker byrden ved at dokumentere store API'er.

/// <summary>Repræsenterer en bruger i systemet.</summary>
public class User { }

Typiske faldgruber

Hyppige fejl er uparrede vinkelparenteser i generics, glemte await, forveksling af => og =, fejl i null-operatorer og oversete semikoloner. Hver lille fejl afbryder flowet. Vellært blindskrivning i C# sænker frekvensen, og hurtig tastning i C# gør rettelser hurtige og smertefri.

Sammenligning med C++ og Java

C# låner idéer fra både C++ og Java, men vælger andre kompromiser, der påvirker daglig indtastning. Sammenlignet med C++ eliminerer C# det meste pointer-syntaks, manuel hukommelsesstyring og opdeling i header/implementering. I praksis giver det færre stjerner (*) og ampersander (&), men flere vinkelparenteser til generics, kantede parenteser til attributter og spørgsmålstegn til nullability. C# understøtter #define til symboler for betinget kompilering, men ikke makroer til teksterstatning eller #include. For blindskrivning i C# giver det en mere forudsigelig rytme end i C++, selv om sproget stadig er symboltæt i LINQ og async/await. Hurtig tastning i C# er lettere at holde, fordi syntaksen favoriserer klarhed.

C# og Java adskiller sig i det "syntaktiske sukker", de tilbyder, og i de symboler, der bruges til at skrive det. Udtryksskabte medlemmer, lambdas, pattern matching, attributter, nullability-annoteringer og strenginterpolation tilfører små, men betydningsfulde tegn. I almindelige Java-klasser skriver man ofte get-/set-metoder og konstruktører eksplicit, mens Java-records mindsker behovet for denne gentagne kode. I C# gør blindskrivning en forskel, fordi små symboler bærer meget semantik - et manglende spørgsmålstegn eller en forvekslet pil kan ændre adfærd. Hurtig tastning i C# sikrer, at brugen af moderne konstruktioner ikke føles langsommelig på trods af flere symboler.

Hvorfor tastaturfærdighed betyder noget

C#'s syntaks er fuld af små, betydningsfulde symboler: vinkelparenteser til generics, kantede parenteser til attributter og indexere, pile til lambdas og switch-udtryk, spørgsmålstegn til nullability, punktummer til kædning og XML-dokumentationskommentarer. De går igen i næsten alle programmer og kræver konsekvent nøjagtighed. Blindskrivning i C# reducerer fejl i generics, attributter og nullability. Hurtig tastning i C# holder tempoet ved dokumentation, refaktorering af egenskaber og eksperimenter med LINQ. Tilsammen flytter de fokus fra tasterne til design og korrekthed.

Opsummering

C# er et udtryksfuldt, struktureret og funktionsrigt sprog. Elegancen kommer ikke af at undgå tegn, men af at give dem betydning: pile til lambdas og switch, spørgsmålstegn til nullability, kantede parenteser til attributter og indexere samt vinkelparenteser til generics. Når du øver blindskrivning i C#, lærer du at skrive disse symboler med større sikkerhed. Sammen med hurtig tastning i C# gør det rutineopgaver som at tilføje overloads, skrive LINQ og dokumentere API'er mere flydende. Tastaturfærdighed hjælper med at skrive og redigere kode hurtigt; korrekt og vedligeholdelig kode kræver også forståelse af sproget, et gennemtænkt programdesign og kontrol af programmets adfærd.

Næste tekst
Næste lektion
Opgave Tilbage til test
cs
Diagram Skjul