Udostępnij za pośrednictwem


Struktury i klasy (Visual Basic)

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ń.

  • Elementy członkowskie obu mogą mieć indywidualne poziomy dostępu. Można na przykład zadeklarować Public jeden element członkowski, a drugi Private.

  • Oba mogą implementować interfejsy.

  • Oba mogą mieć współużytkowane konstruktory z parametrami lub bez tych parametrów.

  • 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.

Differences

Struktury i klasy różnią się następującymi konkretnymi elementami:

  • Struktury są typami wartości; klasy są typami referencyjnymi. Zmienna typu struktury zawiera dane struktury, a nie odwołanie do danych jako typ klasy.

  • Struktury używają alokacji stosu; klasy używają alokacji sterty.

  • 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ępną lub element zdarzenia nonshared, noncustom; 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ępnionaSub i tylko za pomocą instrukcji AddHandler; każda procedura klasy może obsługiwać zdarzenia przy użyciu słowa kluczowego Handles lub instrukcji AddHandler . Aby uzyskać więcej informacji, zobacz Zdarzenia.

  • 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 to.

  • Struktury nigdy nie są przerywane, więc środowisko uruchomieniowe języka wspólnego (CLR) nigdy nie wywołuje metody w żadnej strukturze; klasy są przerywane przez moduł odśmiecania pamięci (GC), który wywołuje FinalizeFinalize klasę, gdy wykryje, że nie ma żadnych aktywnych odwołań pozostałych.

  • Struktura nie wymaga konstruktora; klasa robi.

  • 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:

  • Inicjowania. Zmienna struktury niejawnie zawiera inicjowanie elementów przy użyciu konstruktora bez parametrów struktury. Dim s As struct1 W związku z tym element jest odpowiednikiem Dim s As struct1 = New struct1()elementu .

  • 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.

  • Przypisanie niczego. Wartość Nic można przypisać do zmiennej struktury, ale wystąpienie nadal jest skojarzone ze zmienną . Nadal można wywoływać jej metody i uzyskiwać dostęp do jej elementów danych, chociaż elementy zmiennych są ponownie inicjowane przez przypisanie.

    Natomiast jeśli ustawisz zmienną obiektu na Nothing, usuń skojarzenie jej z dowolnego wystąpienia klasy i nie będzie można uzyskać dostępu do żadnych elementów członkowskich za pośrednictwem zmiennej, dopóki nie przypiszesz do niej innego 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ści. Testowanie równości dwóch struktur musi być wykonywane przy użyciu testu elementu po elemeście. Dwie zmienne obiektu można porównać przy użyciu Equals metody . Equals wskazuje, czy dwie zmienne wskazują to samo wystąpienie.

Zobacz też