TYPY REFERENCYJNE

 

W tym Poście Przejdziemy do następnego rodzaju typów, do typów referencyjnych.

 

Typy referencyjne przechowują referencje do zmiennych.

Co to znaczy i jaka jest różnica między typami wartościowymi a referencyjnymi?
Główną, podstawowa i chyba najważniejszą jest fakt że Typy referencyjne jak sama nazwa mówi, odnoszą się do referencji,czyli do konkretnego miejsca w pamięci programu a nie przechowują rzeczywistych wartości w zmiennej,

Przykładami wbudowanych typów referencyjnych są: obiekty (objects), typy dynamiczne (dynamics) oraz string (typ tekstowy).

TYP OBIEKTOWY

 

Typ obiektowy Object Type jest to klasa bazowa w CTS (Common Type System) dla wszystkich typów danych. CTS to nic innego jak blok składowy platformy .NET (jedne z wielu), który ma za zadanie Przetrzymywać opis czy definicje wszystkich danych udostępnionych przez środowisko uruchomieniowe. Do Object Type możemy przypisać każdy dowolny typ  tj. typ wartościowy, typ referencyjny, możemy również przypisać każdy zdefiniowany typ przez użytkownika, poprzez odpowiednią konwersję.

 

W momencie konwersji dowolnego typu na typ obiektowy mamy do czynienia z operacją boxing. Natomiast kiedy konwertujemy dany obiekt na typ wartościowy to wykonujemy operację unboxing.

CO TO JEST BOXING I UNBOXING

 

Najlepiej to omówić na konkretnym przykładzie.

BOXING

 

Jak już wspominałem Typ wartościowy umieszczone będą na stosie , Natomiast obiekt żyje na stercie, czyli ona jest typu referencyjnego . W wyniku tej operacji wartość ze stosu czyli nasza zmienna “a” zostanie skopiowana na stertę i referencyjnie powiązana z zmienną typu object. Ta operacja nazywa się boxing – mówiąc polskim językiem, będzie spakowana.

 

UNBOXING

 

O ile zastosowanie BOXINGu jest proste, to operacja w drugą stronę czyli UNBOXING już nie koniecznie. W momencie kiedy spróbujecie bezpośrednio przekonwertować object do zmiennej typu int skończy się błędem kompilatora. Obiekt może przechowywać nie tylko zmienną int. Tak naprawdę Obiekt może przechowywać inny typ liczbowy albo referencje do obiektu klasy. Aby poprawnie zastosować UNBOXING należy użyć tzw. “rzutowania” (cast). Rzutowanie to  operacja, która sprawdza czy dany typ może być przekonwertowany na inny. Rzutowanie wykonuje się poprzez dopisanie nawiasów , a w nich typu, na który nasza zmienna mam być przekonwertowana.

Kiedy obiekt rzeczywiście będzie przechowywał zmienną typu int, to rzutowanie wykona się poprawnie.

Powyższy kod również na GitHub.

Podobało się? zostaw komentarz.

 

 

Post Author: Csharpowe Zmagania

Dodaj komentarz

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.