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: csharp,
boxing,
value-type
Categories: Techniczne
6aa99aeb-0daa-4554-86d3-3633c1a2166e|0|.0