Omówienie klas, struktur i rekordów w języku C #
W języku C# definicja typu — klasa, struktura lub rekord — jest jak strategia określająca, co może zrobić typ. Obiekt jest w zasadzie blokiem pamięci, który został przydzielony i skonfigurowany zgodnie z strategią. Ten artykuł zawiera omówienie tych strategii i ich funkcji. W następnym artykule z tej serii przedstawiono obiekty.
Hermetyzacja
Hermetyzacja jest czasami nazywana pierwszym filarem lub zasadą programowania obiektowego. Klasa lub struktura może określać, jak dostępny jest każdy z jego elementów członkowskich, aby kodować poza klasą lub strukturą. Metody i zmienne, które nie są przeznaczone do użycia spoza klasy lub zestawu, mogą być ukryte, aby ograniczyć potencjał błędów kodowania lub złośliwych programów wykorzystujących luki w zabezpieczeniach. Aby uzyskać więcej informacji, zobacz samouczek dotyczący programowania obiektowego .
Elementy członkowskie
Elementy członkowskie typu obejmują wszystkie metody, pola, stałe, właściwości i zdarzenia. W języku C# nie ma zmiennych globalnych ani metod, ponieważ istnieją w niektórych innych językach. Nawet punkt wejścia programu, Main
metoda, musi być zadeklarowana w ramach klasy lub struktury (niejawnie w przypadku używania instrukcji najwyższego poziomu).
Poniższa lista zawiera wszystkie rodzaje składowych, które mogą być zadeklarowane w klasie, strukturę lub rekord.
- Pola
- Stałe
- Właściwości
- Metody
- Konstruktorów
- Zdarzenia
- Finalizatory
- Indexers (Indeksatory)
- Operatory
- Zagnieżdżone typy
Aby uzyskać więcej informacji, zobacz Członkowie.
Ułatwienia dostępu
Niektóre metody i właściwości mają być wywoływane lub uzyskiwane z kodu poza klasą lub strukturą, znaną jako kod klienta. Inne metody i właściwości mogą być używane tylko w klasie lub samej strukturę. Ważne jest, aby ograniczyć dostępność kodu, aby tylko zamierzony kod klienta mógł go osiągnąć. Określasz, w jaki sposób typy i ich elementy członkowskie są dostępne dla kodu klienta przy użyciu następujących modyfikatorów dostępu:
Domyślnym ułatwieniami dostępu jest private
.
Dziedziczenie
Klasy (ale nie struktury) obsługują koncepcję dziedziczenia. Klasa, która pochodzi z innej klasy, nazywanej klasą bazową, automatycznie zawiera wszystkie publiczne, chronione i wewnętrzne składowe klasy bazowej z wyjątkiem jej konstruktorów i finalizatorów.
Klasy mogą być zadeklarowane jako abstrakcyjne, co oznacza, że co najmniej jedna z ich metod nie ma implementacji. Chociaż klasy abstrakcyjne nie mogą być tworzone bezpośrednio, mogą służyć jako klasy bazowe dla innych klas, które zapewniają brakującą implementację. Klasy można również zadeklarować jako zapieczętowane , aby uniemożliwić dziedziczenie z nich innych klas.
Aby uzyskać więcej informacji, zobacz Dziedziczenie i polimorfizm.
Interfejsy
Klasy, struktury i rekordy mogą implementować wiele interfejsów. Implementacja z interfejsu oznacza, że typ implementuje wszystkie metody zdefiniowane w interfejsie. Aby uzyskać więcej informacji, zobacz Interfejsy.
Typy ogólne
Klasy, struktury i rekordy można zdefiniować przy użyciu co najmniej jednego parametru typu. Kod klienta dostarcza typ podczas tworzenia wystąpienia typu. Na przykład List<T> klasa w System.Collections.Generic przestrzeni nazw jest definiowana przy użyciu jednego parametru typu. Kod klienta tworzy wystąpienie obiektu List<string>
lub List<int>
w celu określenia typu, który będzie przechowywana na liście. Aby uzyskać więcej informacji, zobacz Generics (Typy ogólne).
Typy statyczne
Klasy (ale nie struktury lub rekordy) można zadeklarować jako static
. Klasa statyczna może zawierać tylko statyczne elementy członkowskie i nie można utworzyć wystąpienia za pomocą słowa kluczowego new
. Jedna kopia klasy jest ładowana do pamięci podczas ładowania programu, a jej składowe są dostępne za pośrednictwem nazwy klasy. Klasy, struktury i rekordy mogą zawierać statyczne elementy członkowskie. Aby uzyskać więcej informacji, zobacz Statyczne klasy i statyczne składowe klas.
Zagnieżdżone typy
Klasę, strukturę lub rekord można zagnieżdżać w ramach innej klasy, struktury lub rekordu. Aby uzyskać więcej informacji, zobacz Typy zagnieżdżone.
Typy częściowe
Część klasy, struktury lub metody można zdefiniować w jednym pliku kodu, a drugą część w osobnym pliku kodu. Aby uzyskać więcej informacji, zobacz Klasy częściowe i metody.
Inicjatory obiektów
Można utworzyć wystąpienie i zainicjować obiekty klasy lub struktury oraz kolekcje obiektów, przypisując wartości do jej właściwości. Aby uzyskać więcej informacji, zobacz How to initialize objects by using an object initializer (Jak zainicjować obiekty przy użyciu inicjatora obiektów).
Typy anonimowe
W sytuacjach, gdy nie jest to wygodne lub konieczne, aby utworzyć nazwaną klasę, należy użyć typów anonimowych. Typy anonimowe są definiowane przez nazwane elementy członkowskie danych. Aby uzyskać więcej informacji, zobacz Typy anonimowe.
Metody rozszerzania
Klasę można "rozszerzyć" bez tworzenia klasy pochodnej, tworząc oddzielny typ. Ten typ zawiera metody, które mogą być wywoływane tak, jakby należały do oryginalnego typu. Aby uzyskać więcej informacji, zobacz Metody rozszerzeń).
Jawnie wpisana zmienna lokalna
W klasie lub metodzie struktury można użyć niejawnego wpisywania, aby poinstruować kompilatora, aby określić typ zmiennej w czasie kompilacji. Aby uzyskać więcej informacji, zobacz var (odwołanie w C#).
Rekordy
Język C# 9 wprowadza record
typ odwołania, który można utworzyć zamiast klasy lub struktury. Rekordy to klasy z wbudowanym zachowaniem hermetyzowania danych w niezmiennych typach. Język C# 10 wprowadza record struct
typ wartości. Rekord ( record class
lub record struct
) udostępnia następujące funkcje:
- Zwięzła składnia tworzenia typu odwołania z niezmiennymi właściwościami.
- Równość wartości. Dwie zmienne typu rekordu są równe, jeśli mają ten sam typ, a jeśli dla każdego pola wartości w obu rekordach są równe. Klasy używają równości odwołań: dwie zmienne typu klasy są równe, jeśli odwołują się do tego samego obiektu.
- Zwięzła składnia mutacji niezwiązanej.
Wyrażenie
with
umożliwia utworzenie nowego wystąpienia rekordu, które jest kopią istniejącego wystąpienia, ale z określonymi wartościami właściwości zostały zmienione. - Wbudowane formatowanie do wyświetlania.
Metoda
ToString
wyświetla nazwę typu rekordu oraz nazwy i wartości właściwości publicznych. - Obsługa hierarchii dziedziczenia w klasach rekordów. Klasy rekordów obsługują dziedziczenie. Struktury rekordów nie obsługują dziedziczenia.
Aby uzyskać więcej informacji, zobacz Rekordy.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.