Boxing oraz typy wartościowe

Ostatnio pokazałem poniższy kod kolegą, z pytaniem co się pojawi na konsoli. Kod wyglądał tak:

   1: int a = 10;
   2: object boxed = a;
   3: a = 5;
   4: Console.WriteLine(boxed);

Część osób odpowiedziała, że 5, a część, że 10. A jaka jest poprawna odpowiedz? Na pierwszy rzut oka mogłoby się wydać, że powinna zostać wypisana liczba 5, ponieważ typ object wskazuje na pewien obszar w pamięci i części osób może się wydać, że jest to obszar, w którym znajduje się wartość zmiennej a.

No ale tutaj wychodzi różnica między typami referencyjnymi oraz wartościowymi. A dokładniej lokalizacji w pamięci, gdzie oba rodzaje typów są przechowywane. Typy wartościowe znajdują się na stosie (tam też znajdują się referencje to typów referencyjnych). Natomiast typy referencyjne znajdują się na stercie.

W przykładzie podczas pakowania zmiennej a do typu referencyjnego następuje skopiowanie wartości z stosu na stertę (utworzony jest tam odpowiedni obiekt typu referencyjnego). Referencja boxed później wskazuje na ten obszar pamięci. Wtedy zmiana zmiennej a z stosu, nie powoduje zmiany wartości zmiennej na stercie, przez co na ekranie wyświetli się liczba 10, a nie 5.

Tags: , ,
Categories: Techniczne

Permalink E-mail | Kick it! | DZone it! | del.icio.us Komentarze (0) Post RSSRSS comment feed

Dodaj komentarz


(Będzie pokazywało Gravatar ikon)

  Country flag

biuquote
  • Komentarz
  • Przegląd
Loading