Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten samouczek zawiera informacje na temat tworzenia typów w języku C#. Piszesz małe ilości kodu, a następnie kompilujesz i uruchamiasz ten kod. Samouczek zawiera serię lekcji, które eksplorują różne rodzaje typów w języku C#. Te lekcje nauczą Cię podstaw języka C#.
Wskazówka
Gdy blok fragmentu kodu zawiera przycisk "Uruchom", ten przycisk otwiera okno interakcyjne lub zastępuje istniejący kod w oknie interaktywnym. Gdy fragment kodu nie zawiera przycisku "Uruchom", możesz skopiować kod i dodać go do bieżącego okna interaktywnego.
Poprzednie samouczki pracowały z tekstem i liczbami. Ciągi i liczby są prostymi typami: każdy przechowuje jedną wartość. W miarę zwiększania się liczby programów należy pracować z bardziej zaawansowanymi strukturami danych. Język C# udostępnia różne rodzaje typów, które można zdefiniować, gdy potrzebujesz struktur danych z większą częścią pól, właściwości lub zachowania. Zacznijmy eksplorować te typy.
Krotki
Tupla to uporządkowana sekwencja wartości o stałej długości. Każdy element krotki ma typ i opcjonalną nazwę. Poniższy kod deklaruje krotkę reprezentującą punkt 2D. Wybierz przycisk "Uruchom", aby wkleić następujący kod do okna interaktywnego i uruchomić go.
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}.");
Wskazówka
Podczas eksplorowania języka C# (lub dowolnego języka programowania) popełniasz błędy podczas pisania kodu. Kompilator odnajduje te błędy i zgłasza je Tobie. Gdy dane wyjściowe zawierają komunikaty o błędach, przyjrzyj się bliżej przykładowemu kodowi i kodowi w oknie interaktywnym, aby zobaczyć, co należy naprawić. To ćwiczenie pomaga poznać strukturę kodu w języku C#.
Możesz ponownie przypisać dowolny element członkowski krotki. Dodaj następujący kod w oknie interaktywnym po istniejącym kodzie. Ponownie naciśnij pozycję "Uruchom", aby wyświetlić wyniki.
pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");
Możesz również utworzyć nową krotkę, która jest zmodyfikowaną kopią oryginału, korzystając z wyrażenia with
. Dodaj następujący kod po kodzie już w oknie interaktywnym i naciśnij "Uruchom", aby wyświetlić wyniki:
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");
Krotka pt2
zawiera wartość X
pt
(6), a pt2.Y
ma wartość 10.
Krotki są typami strukturalnymi. Innymi słowy, typy krotek nie mają nazw takich jak string
lub int
. Typ krotki jest definiowany przez liczbę elementów członkowskich, nazywanych arity i typami tych elementów członkowskich. Nazwy członków są dla wygody. Krotkę można przypisać do krotki o tej samej liczbie elementów i typach, nawet jeśli elementy mają różne nazwy. Możesz dodać następujący kod po kodzie, który został już napisany w oknie interaktywnym i wypróbować go:
var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);
Zmienna subscript
ma dwa elementy członkowskie, z których obie są liczbami całkowitymi. Zarówno subscript
, jak i pt
reprezentują wystąpienia tego samego typu krotki: krotka zawierająca 2 int
elementy.
Krotki są łatwe do utworzenia: deklarujesz wiele elementów ujętych w nawiasach. Wszystkie poniższe deklaracje różnych krotki różnych typów arities i składowych. Dodaj następujący kod, aby utworzyć nowe typy danych krotek:
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);
Tuples są łatwe do utworzenia, ale są ograniczone, jeśli chodzi o ich możliwości. Typy krotek nie mają nazw, więc nie można przekazać znaczenia zestawowi wartości. Typy krotki nie mogą dodawać zachowania. Język C# ma inne rodzaje typów, które można utworzyć, gdy typ definiuje zachowanie.
Tworzenie typów rekordów
Krotki są doskonałe dla tych czasów, gdy chcesz mieć wiele wartości w tej samej strukturze. Są lekkie i można je zadeklarować w miarę ich użycia. W miarę jak twój program postępuje, może się okazać, że używasz tego samego typu krotki w całym kodzie. Jeśli twoja aplikacja działa w obszarze grafu 2D, krotki reprezentujące punkty mogą być typowe. Gdy to znajdziesz, możesz zadeklarować typ record
, który przechowuje te wartości i oferuje większą funkcjonalność. Poniższy przykładowy kod używa Main
metody do reprezentowania punktu wejścia dla programu. W ten sposób można zadeklarować record
typ poprzedzający punkt wejścia w kodzie. Naciśnij przycisk "Uruchom" w poniższym kodzie, aby zastąpić istniejący przykład poniższym kodem.
Ostrzeżenie
Nie kopiuj i wklejaj. Aby uruchomić poniższy przykład, należy zresetować okno interakcyjne. Jeśli popełnisz błąd, okno się zawiesza i musisz odświeżyć stronę, aby kontynuować.
Poniższy kod deklaruje i używa record
typu do reprezentowania Point
elementu, a następnie używa struktury Point
w metodzie Main
:
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}");
}
Deklaracja record
jest pojedynczym wierszem kodu dla Point
typu, który przechowuje wartości X
i Y
we właściwościach readonly. Używasz nazwy Point
wszędzie tam, gdzie używasz tego typu. Poprawnie nazwane typy, takie jak Point
, dają informacje o tym, jak typ jest używany. Metoda Main
pokazuje, jak za pomocą with
wyrażenia utworzyć nowy punkt, który jest zmodyfikowaną kopią istniejącego punktu. Wiersz pt2 = pt with { Y = 10 }
stwierdza, że "pt2
ma takie same wartości jak pt
, z wyjątkiem tego, że Y
jest równe 10." Możesz dodać dowolną liczbę właściwości do zmiany w pojedynczym wyrażeniu with
.
Poprzednia record
deklaracja jest pojedynczym wierszem kodu, który kończy się na ;
, podobnie jak wszystkie instrukcje języka C#. Zachowanie można dodać do record
typu, deklarując członków. Członek rekordu może być funkcją lub innymi elementami danych. Elementy członkowskie typu znajdują się w deklaracji typu między znakami {
i }
. Zastąp deklarację rekordu utworzoną następującym kodem:
public record Point(int X, int Y)
{
public double Slope() => (double)Y / (double)X;
}
Następnie dodaj następujący kod do Main
metody po wierszu zawierającym with
wyrażenie:
double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");
Dodano formalność do krotki reprezentującej wartość X
i Y
. Definiowałeś to jako record
, który określa nazwany typ i zawiera członka do obliczenia nachylenia. Typ record
jest skrótem dla typu record class
: class
typ, który zawiera dodatkowe zachowanie. Możesz zmodyfikować typ Point
, aby stał się także typem record struct
.
public record struct Point(int X, int Y)
{
public double Slope() => (double) Y / (double) X;
}
Typ record struct
to struct
typ, który zawiera dodatkowe zachowanie dodane do wszystkich record
typów.
Typy struktur, klas i interfejsów
Wszystkie typy nazwane w języku C# są albo typami class
, albo typami struct
. A class
to typ odwołania. A struct
jest typem wartości. Zmienne typu wartości przechowują zawartość wystąpienia wbudowanego w pamięci. Innymi słowy, element record struct Point
przechowuje dwie liczby całkowite: X
i Y
. Zmienne typu odwołania przechowują odwołanie lub wskaźnik do magazynu dla wystąpienia. Innymi słowy, element record class Point
przechowuje odwołanie do bloku pamięci, który zawiera wartości dla X
i Y
.
W praktyce oznacza to, że typy wartości są kopiowane po przypisaniu, ale kopia wystąpienia klasy jest kopią odwołania. Skopiowane odwołanie odnosi się do tego samego wystąpienia punktu, korzystając z tej samej pamięci dla X
i Y
.
Modyfikator record
nakazuje kompilatorowi utworzenie kilku członków. Więcej informacji można dowiedzieć się w artykule dotyczącym typów rekordów w sekcji Podstawy.
Podczas deklarowania record
typu należy zadeklarować, że typ powinien używać domyślnego zestawu zachowań dla porównań równości, przypisania i kopiowania wystąpień tego typu. Rekordy są najlepszym wyborem, gdy przechowywanie powiązanych danych jest główną odpowiedzialnością twojego typu. W miarę dodawania większej liczby zachowań rozważ użycie typów struct
lub class
bez modyfikatora record
.
Typy struct
dla typów wartości są używane, gdy potrzebne jest bardziej zaawansowane zachowanie, ale ich główną rolą jest przechowywanie wartości. Typy class
służą do używania idiomów zorientowanych na obiekty, takich jak hermetyzacja, dziedziczenie i polimorfizm.
Można również zdefiniować interface
typy, aby zadeklarować kontrakty behawioralne, które muszą implementować różne typy. Oba struct
i class
typy mogą implementować interfejsy.
Zazwyczaj wszystkie te typy są używane w większych programach i bibliotekach. Po zainstalowaniu zestawu .NET SDK możesz eksplorować te typy przy użyciu samouczków dotyczących klas w sekcji Podstawy.
Ukończono interaktywny samouczek "Tworzenie typów w języku C#". Możesz wybrać link Gałęzie i pętle, aby rozpocząć następny interaktywny samouczek, lub odwiedzić witrynę platformy .NET, aby pobrać zestaw SDK platformy .NET, utworzyć projekt na maszynie i kontynuować kodowanie. Sekcja "Następne kroki" zawiera powrót do tych samouczków.
Więcej informacji na temat typów w języku C# można dowiedzieć się w następujących artykułach: