Typy wartościowe i referencyjne

Do typów wartościowych zalicza się większość typów wbudowanych np. int, char, bool oraz struktury (struct) i wyliczenia (enum).
Do typów referencyjnych zalicza się wszystkie klasy, tablice, delegacje oraz interfejsy.

Różnica między tymi typami jest zasadnicza i może sprawić niespodziankę młodym programistom. Otóż w typie wartościowym nazwa zmiennej bezpośrednio wskazuje na wartość. Co oznacza, że przy przypisaniu dwóch zmiennych typu wartościowego wykonujemy kopie wartości. Pokazuje to poniższy kod analizujący struktury.

Kluczowa jest linia 24 programu. W rezultacie struktura myObject2 przejmie wartości ze struktury myObject1. Po tym przypisaniu następuje jednak w liniach 26, 27 zastąpienie wartości przechowywanej przez myObejct1 wartością 0;

Bardzo ważna jest teraz analiza wartości przechowywanych przez obie struktury. Struktura myObejct1 przechowuje wartość 0 przypisane w liniach 26,27. Struktura myObject2 te wartości które przypisano w linii 24 programu, czyli 11 i 21. Obie zmienne przechowują więc różne wartości. Pokazuje to wynik działania kodu.


Inaczej jest w kwestii typu referencyjnego. Pokazuje to poniższy kod, w którym jest analizowana klasa.

Podobnie jak w poprzednim kodzie kluczowe są linie 24, 26, 27. Przypisanie z linii 24 w przypadku typu referencyjnego nie będzie prowadziło do kopiowania wartości z jednego obiektu do drugiego, a skopiowanie referencji do obiektu. Skutek jest taki, że na jeden obiekt wskazują teraz dwie referencje. Przypisanie w liniach 26, 27 nie powoduje zmiany wartości tylko w myObject1, ale też myObject2, dlatego, że oba wskazują na to samo. Obie zmienne przechowują więc te same wartości. Pokazuje to wynik działania kodu.

Wniosek, jest taki, że w trybie referencyjnym trzeba być bardzo uważnym. Warto też mieć świadomość jaki typ jest referencyjny a jaki wartościowy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *