Opret indkapslede data med strukturer i C#
Når du arbejder på projektet for at spore ordreoplysninger, skal du bruge en måde at holde relaterede oplysninger som kundens navn, forsendelsesadresse og ordretotal samlet på. Med strukturer i C# kan du oprette en grundlæggende indkapslet objektbeholder til disse data, hvilket gør det nemmere at arbejde med og overføre dem som en enkelt enhed.
Forstå strukturer
Strukturer er værdityper i C#, hvilket betyder, at de gemmer deres data direkte i stedet for at referere til dem. Du kan bruge nøgleordet struct til at definere en struktur. Strukturer bruges typisk til små datacentrerede typer, der giver minimal funktionsmåde.
- Strukturer har værdisemantik, hvilket betyder, at deres værdier kopieres under tildelings- eller metodekald.
- Almindelige use cases omfatter repræsenterer tal, booleske værdier, tegn og klokkeslætsforekomster.
- Strukturer bruges ofte til at repræsentere lette data, f.eks. geometriske figurer (f.eks.
Rectangle,Circle), koordinater eller konfigurationsindstillinger.
Strukturer er bedst egnet til små, uforanderlige og ydeevnekritiske data. I forbindelse med større, mere komplekse objekter, eller når funktionsmåde er et fokus, kan du overveje at bruge klasser i stedet. I modsætning til klasser kan strukturer ikke arve fra andre strukturer eller klasser, men de kan implementere grænseflader.
Drikkepenge
Hvis din type fokuserer på funktionsmåde i stedet for data, er klasser ofte et bedre valg på grund af deres reference semantik.
Definer og implementer en struktur
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Kodeeksempel viser, hvordan du definerer en struktur med felter og en konstruktør i C#.
Strukturer kan også implementere grænseflader, men kan ikke nedarve fra andre klasser eller strukturer.
Indkapsler data med strukturer
Indkapsling giver dig mulighed for at styre adgangen til dataene i en struktur. Brug adgangsmodifikatorer som private, publiceller internal til at angive tilgængelighed.
- Felter og egenskaber kan gøres private for at begrænse direkte adgang.
- Metoder kan give kontrollerede måder at interagere med dataene på.
Det kan f.eks. være:
public struct Rectangle
{
private int width;
private int height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public int Area => width * height;
}
Kodeeksempel viser en struktur i C# med indkapslede felter og en beregnet egenskab for området.
Anvend skrivebeskyttet modifikator på strukturer for uforanderlighed
Uforanderlighed sikrer, at når en struktur er oprettet, kan dataene ikke ændres. En struktur er nyttig, når du arbejder med data, der skal forblive konstante i hele dens levetid, f.eks. koordinater eller konfigurationsværdier. Når du anvender modifikatoren readonly på en struktur, kan du gennemtvinge uforanderlighed, hvilket gør din kode mere forudsigelig og mindre tilbøjelig til fejl, der skyldes utilsigtede ændringer.
public readonly struct ImmutablePoint
{
public int X { get; init; }
public int Y { get; init; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
}
Kodeeksempel viser brugen af modifikatoren readonly til at oprette en uforanderlig struktur i C#.
Bemærk!
Selvom selve strukturering er uforanderlig, kan mutable referencetyper i den stadig ændre deres tilstand.
Brug objektinitialisering med strukturer
Når du arbejder med strukturer, skal du ofte initialisere flere egenskaber. Initialiseringsfunktionen til objekter giver en enkel og læsbar måde at oprette og initialisere struktureringsforekomster på i et enkelt trin. Denne fremgangsmåde reducerer gentagen kode og gør din hensigt klar.
Følgende kodeeksempel definerer en struktur med egenskaber, der grupperer relaterede data sammen og gør det nemmere at initialisere og arbejde med forekomster af den pågældende struktur.
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
Ved hjælp af en objektinitialiseringsfunktion kan du oprette og initialisere en Point:
var point = new Point { X = 10, Y = 20 };
Kodeeksempel viser, hvordan du bruger en objektinitialisering til at angive egenskabsværdier, når du opretter en strukturforekomst.
Drikkepenge
Initialisering af objekter gør din kode mere præcis og nemmere at læse, når du arbejder med strukturer, der har flere egenskaber.
Praktisk eksempel: Brug af strukturer til at repræsentere punkter i 2D-mellemrum
Strukturer bruges ofte til at repræsentere små uforanderlige datastrukturer. Du kan f.eks. bruge en struktur til at repræsentere et punkt i 2D-mellemrum og beregne afstanden mellem to punkter:
public struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public double DistanceTo(Point other)
{
int dx = X - other.X;
int dy = Y - other.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
var point1 = new Point(3, 4);
var point2 = new Point(7, 1);
Console.WriteLine($"Distance between points: {point1.DistanceTo(point2)}");
I dette eksempel kan du se, hvordan du definerer en struktur for et punkt, beregner afstanden mellem to punkter og bruger den i et enkelt program.
Ved at kombinere indkapsling, uforanderlighed og initialisering af objekter kan du oprette strukturer, der er effektive og forudsigelige. Disse funktioner hjælper dig med at administrere relaterede data på en ren og organiseret måde.