Skapa typer i C#

I den här handledningen lär du dig att skapa typer i C#. Du skriver små mängder kod och kompilerar och kör sedan koden. Självstudien innehåller en serie lektioner som utforskar olika typer av datatyper i C#. De här lektionerna lär dig grunderna i C#-språket.

Tips/Råd

När ett kodfragmentblock innehåller knappen "Kör" öppnas det interaktiva fönstret eller ersätter den befintliga koden i det interaktiva fönstret. När kodfragmentet inte innehåller någon "Kör"-knapp kan du kopiera koden och lägga till den i det aktuella interaktiva fönstret.

De föregående självstudierna fungerade med text och siffror. Strängar och tal är enkla typer: De lagrar var och en ett enda värde. När dina program blir större måste du arbeta med mer avancerade datastrukturer. C# innehåller olika typer av typer som du kan definiera när du behöver datastrukturer med fler fält, egenskaper eller beteende. Nu ska vi börja utforska dessa typer.

Tupler

Tupplar är en ordnad sekvens med värden med fast längd. Varje element i en tupl har en typ samt ett valfritt namn. Följande kod deklarerar en tupl som representerar en 2D-punkt. Välj knappen "Kör" för att klistra in följande kod i det interaktiva fönstret och kör den.

var pt = (X: 1, Y: 2);

var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");

Tips/Råd

När du utforskar C# (eller något programmeringsspråk) gör du misstag när du skriver kod. Kompilatorn hittar dessa fel och rapporterar dem till dig. När utdata innehåller felmeddelanden bör du titta närmare på exempelkoden och koden i det interaktiva fönstret för att se vad som ska åtgärdas. Den här övningen hjälper dig att lära dig strukturen för C#-kod.

Du kan ändra värdet på valfri medlem i en tupl. Lägg till följande kod i det interaktiva fönstret efter den befintliga koden. Tryck på "Kör" igen för att se resultatet.

pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");

Du kan också skapa en ny tuppel som är en ändrad kopia av originalet med ett with uttryck. Lägg till följande kod efter koden som redan finns i det interaktiva fönstret och tryck på "Kör" för att se resultatet:

var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");

Tuppeln pt2 innehåller X värdet pt (6) och pt2.Y är 10.

Tupplar är strukturella typer. Med andra ord har typer av tupler inte namn som string eller int. Tuplens typ definieras av antalet medlemmar, som kallas arity, och typerna av dessa medlemmar. Medlemsnamnen är för enkelhetens skull. Du kan tilldela en tuppel till en tuppel med samma kardinalitet och datatyper, även om medlemmarna har olika namn. Du kan lägga till följande kod efter den kod som du redan skrev i det interaktiva fönstret och prova den:

var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);

Variabeln subscript har två medlemmar, som båda är heltal. Både subscript och pt representerar instanser av samma tuppeltyp: en tuppel som innehåller 2 int medlemmar.

Tupplar är enkla att skapa: Du deklarerar flera medlemmar inom parenteser. Alla följande deklarerar olika tupler av olika ariteter och medlemstyper. Lägg till följande kod för att skapa nya tupppeltyper:

var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);

Tupler är enkla att skapa, men de är begränsade i sina möjligheter. Tupltyper har inga namn, så du kan inte ange någon betydelse till uppsättningen av värden. Tuppeltyper kan inte lägga till beteende. C# har andra typer av typer som du kan skapa när din typ definierar beteende.

Skapa posttyper

Tupplar är bra för de tider då du vill ha flera värden i samma struktur. De är lätta och kan deklareras när de används. När ditt program körs kan du upptäcka att du använder samma tupltyp i hela koden. Om din app fungerar i 2D-grafutrymmet kan tupplar som representerar punkter vara vanliga. När du upptäcker det kan du deklarera en record typ som lagrar dessa värden och ger fler funktioner. Följande kodexempel använder en Main metod för att representera startpunkten för programmet. På så sätt kan du deklarera en record typ som föregår startpunkten i koden. Tryck på knappen "Kör" på följande kod för att ersätta ditt befintliga exempel med följande kod.

Varning

Kopiera och klistra inte in. Det interaktiva fönstret måste återställas för att köra följande exempel. Om du gör ett misstag låser sig fönstret och du måste uppdatera sidan för att fortsätta.

Följande kod deklarerar och använder en record typ för att representera en Point, och sedan använder Point strukturen i Main-metoden:

public record Point(int X, int Y);

public static void Main()
{
    Point pt = new Point(1, 1);
    var pt2 = pt with { Y = 10 };
    Console.WriteLine($"The two points are {pt} and {pt2}");
}

Deklarationen record är en enda kodrad för den Point typ som lagrar värdena X och Y i skrivskyddade egenskaper. Du använder namnet Point var du än använder den typen. Korrekt namngivna typer, till exempel Point, ger information om hur typen används. Metoden Main visar hur du använder ett with uttryck för att skapa en ny punkt som är en ändrad kopia av den befintliga punkten. Raden pt2 = pt with { Y = 10 } säger "pt2 har samma värden som pt förutom som Y har tilldelats till 10." Du kan lägga till valfritt antal egenskaper som ska ändras i ett enda with uttryck.

Föregående record deklaration är en enda kodrad som slutar i ;, som alla C#-instruktioner. Du kan lägga till beteende i en record typ genom att deklarera medlemmar. En postmedlem kan vara en funktion eller flera dataelement. Medlemmarna av en typ finns i typdeklarationen, mellan { och } tecken. Ersätt postdeklarationen som du gjorde med följande kod:

public record Point(int X, int Y)
{
    public double Slope() => (double)Y / (double)X;
}

Lägg sedan till följande kod i Main metoden efter raden som innehåller with uttrycket:

double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");

Du har lagt till formalitet i tuppeln som representerar ett X och Y -värde. Du gjorde den till en record som definierade en namngiven typ och inkluderade en medlem för att beräkna lutningen. En record typ är en förkortning för : record classEn class typ som innehåller extra beteende. Du kan också ändra Point typen så att den blir en record struct :

public record struct Point(int X, int Y)
{
    public double Slope() => (double) Y / (double) X;
}

A record struct är en struct typ som innehåller det extra beteende som läggs till i alla record typer.

Struct-, klass- och gränssnittstyper

Alla namngivna typer i C# är antingen class eller struct typer. A class är en referenstyp. A struct är en värdetyp. Variabler av en värdetyp lagrar innehållet i instansen direkt i minnet. Med andra ord lagrar en record struct Point två heltal: X och Y. Variabler av en referenstyp lagrar en referens, eller pekare, till lagringen för instansen. Med andra ord lagrar en record class Point referens till ett minnesblock som innehåller värdena för X och Y.

I praktiken innebär det att värdetyper kopieras när de tilldelas, men en kopia av en klassinstans är en kopia av referensen. Den kopierade referensen refererar till samma instans av en punkt, med samma lagring för X och Y.

Modifieraren record instruerar kompilatorn att skriva flera medlemmar åt dig. Du kan läsa mer i artikeln om posttyper i avsnittet om grunderna.

När du deklarerar en record typ deklarerar du att din typ ska använda en standarduppsättning med beteenden för likhetsjämförelser, tilldelning och kopiering av instanser av den typen. Register är det bästa valet när det primära ansvaret för din typ är att lagra relaterad data. När du lägger till fler beteenden bör du överväga att använda struct eller class typer, utan record modifieraren.

Du använder struct typer för värdetyper när mer avancerat beteende behövs, men det primära ansvaret är att lagra värden. Du använder class typer för att använda objektorienterade idiom som inkapsling, arv och polymorfism.

Du kan också definiera interface typer för att deklarera beteendekontrakt som olika typer måste implementera. Både struct och class typer kan implementera gränssnitt.

Du använder vanligtvis alla dessa typer i större program och bibliotek. När du har installerat .NET SDK kan du utforska dessa typer med hjälp av självstudier på klasser i avsnittet grunderna.

Du har slutfört den interaktiva självstudien "Skapa typer i C#". Du kan välja länken Grenar och loopar för att starta nästa interaktiva självstudie, eller så kan du gå till .NET-webbplats för att ladda ned .NET SDK, skapa ett projekt på datorn och fortsätta koda. Avsnittet "Nästa steg" tar dig tillbaka till de här självstudierna.

Du kan lära dig mer om typer i C# i följande artiklar: