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.
Visual Basic łączy składnię struktur i klas z wynikiem, że obie jednostki obsługują większość tych samych funkcji. Istnieją jednak również istotne różnice między strukturami i klasami.
Klasy mają zaletę bycia typami referencyjnymi — przekazywanie odwołania jest bardziej wydajne niż przekazywanie zmiennej struktury ze wszystkimi danymi. Z drugiej strony struktury nie wymagają alokacji pamięci na globalnej stercie.
Ponieważ nie można dziedziczyć ze struktury, struktury powinny być używane tylko dla obiektów, które nie muszą być rozszerzone. Użyj struktur, gdy obiekt, który chcesz utworzyć, ma niewielki rozmiar wystąpienia i weź pod uwagę charakterystykę wydajności klas i struktur.
Podobieństwa
Struktury i klasy są podobne w następujących kwestiach:
Oba są typami kontenerów , co oznacza, że zawierają inne typy jako elementy członkowskie.
Oba mają elementy członkowskie, które mogą zawierać konstruktory, metody, właściwości, pola, stałe, wyliczenia, zdarzenia i programy obsługi zdarzeń.
Członkowie obu grup mogą mieć indywidualny poziom dostępu. Na przykład można zadeklarować
Public
jeden członek, a drugiPrivate
.Oba mogą implementować interfejsy.
Oba mogą mieć współużytkowane konstruktory, z parametrami lub bez.
Obie mogą uwidocznić właściwość domyślną, pod warunkiem, że właściwość przyjmuje co najmniej jeden parametr.
Oba mogą deklarować i zgłaszać zdarzenia, a oba mogą deklarować delegatów.
Różnice
Struktury i klasy różnią się następującymi konkretnymi elementami:
Struktury są typami wartości; klasy są typami referencyjnymi. Zmienna typu struktury zawiera bezpośrednio dane struktury, w przeciwieństwie do typu klasy, który zawiera odwołanie do danych.
Struktury korzystają z alokacji stosu, natomiast klasy z alokacji na stercie.
Wszystkie elementy struktury są
Public
domyślnie; zmienne klasy i stałe sąPrivate
domyślnie, podczas gdy inne składowe klasy sąPublic
domyślnie. To zachowanie elementów członkowskich klasy zapewnia zgodność z systemem domyślnym języka Visual Basic 6.0.Struktura musi mieć co najmniej jedną zmienną nieudostępnioną lub element zdarzenia, który nie jest udostępniony ani dostosowany; klasa może być całkowicie pusta.
Nie można zadeklarować elementów struktury jako
Protected
; składowe klasy mogą.Procedura struktury może obsługiwać zdarzenia tylko wtedy, gdy jest to procedura udostępniona
Sub
i tylko za pomocą instrukcji AddHandler; każda procedura klasy może obsługiwać zdarzenia przy użyciu słowa kluczowego Handles lub instrukcjiAddHandler
. Aby uzyskać więcej informacji, zobacz Events.Deklaracje zmiennych struktury nie mogą określać inicjatorów ani początkowych rozmiarów tablic; deklaracje zmiennych klasy mogą.
Struktury niejawnie dziedziczą z System.ValueType klasy i nie mogą dziedziczyć z dowolnego innego typu; klasy mogą dziedziczyć z dowolnej klasy lub klas innych niż System.ValueType.
Struktury nie są dziedziczone; klasy są dziedziczne.
Struktury nigdy nie są zakończone, więc środowisko uruchomieniowe języka wspólnego (CLR) nigdy nie wywołuje metody Finalize w żadnej strukturze; klasy są zakończone przez kolektor śmieci (GC), który wywołuje metodę Finalize na klasie, gdy wykryje, że nie ma żadnych aktywnych odwołań pozostałych.
Struktura nie wymaga konstruktora, natomiast klasa wymaga.
Struktury mogą mieć konstruktory nieudostępne tylko wtedy, gdy przyjmują parametry; klasy mogą mieć je z parametrami lub bez nich.
Każda struktura ma niejawny publiczny konstruktor bez parametrów. Ten konstruktor inicjuje wszystkie elementy danych struktury do ich wartości domyślnych. Nie można ponownie zdefiniować tego zachowania.
Wystąpienia i zmienne
Ponieważ struktury są typami wartości, każda zmienna struktury jest trwale powiązana z pojedynczym wystąpieniem struktury. Jednak klasy są typami referencyjnymi, a zmienna obiektu może odwoływać się do różnych wystąpień klas w różnym czasie. To rozróżnienie wpływa na użycie struktur i klas w następujący sposób:
Inicjalizacja. Zmienna struktury niejawnie zawiera inicjowanie elementów przy użyciu konstruktora bez parametrów struktury. W związku z tym
Dim s As struct1
jest odpowiednikiemDim s As struct1 = New struct1()
.Przypisywanie zmiennych. Po przypisaniu jednej zmiennej struktury do innej lub przekazaniu wystąpienia struktury do argumentu procedury bieżące wartości wszystkich elementów zmiennych są kopiowane do nowej struktury. Po przypisaniu jednej zmiennej obiektu do innej lub przekazaniu zmiennej obiektu do procedury kopiowany jest tylko wskaźnik odniesienia.
Nic nie przypisano. Wartość Nic można przypisać do zmiennej struktury, ale wystąpienie nadal jest skojarzone ze zmienną . Można nadal wywoływać jej metody i uzyskiwać dostęp do jej elementów danych, choć elementy zmienne są ponownie inicjowane przy przypisaniu.
Natomiast, jeśli ustawisz zmienną obiektu na
Nothing
, odłączysz ją od jakiegokolwiek wystąpienia klasy i nie będziesz mógł uzyskać dostępu do żadnych elementów członkowskich za pośrednictwem zmiennej, dopóki nie przypiszesz jej nowego wystąpienia.Wiele wystąpień. Zmienna obiektu może mieć przypisane do niej różne wystąpienia klas w różnym czasie, a kilka zmiennych obiektu może odwoływać się do tego samego wystąpienia klasy w tym samym czasie. Zmiany wprowadzone w wartościach składowych klasy mają wpływ na te elementy członkowskie w przypadku uzyskiwania dostępu za pośrednictwem innej zmiennej wskazującej to samo wystąpienie.
Elementy struktury są jednak izolowane we własnym wystąpieniu. Zmiany ich wartości nie są odzwierciedlane w innych zmiennych struktury, nawet w innych wystąpieniach tej samej
Structure
deklaracji.Równość. Testowanie równości dwóch struktur musi być wykonywane poprzez test element po elemencie. Dwie zmienne obiektu można porównać przy użyciu Equals metody . Equals wskazuje, czy dwie zmienne wskazują to samo wystąpienie.
Zobacz także
- Data types (Typy danych)
- Typy danych złożonych
- typy wartości i typy referencyjne
- struktury
- Rozwiązywanie problemów z typami danych
- Struktury i inne elementy programowania
- Obiekty i klasy