boxing i unboxing

0
        static void Main(string[] args)
        {
            int myInt = 25;
            object boxedInt = myInt; 
            Console.WriteLine("int: {0}, object: {1}", myInt, boxedInt);

            Console.ReadLine();
        }

Czy jak do obiektu boxedInt przypisuje wartość myInt to czy ten obiekt wtedy wskazuje na zmienną myInt czy tylko przyjmuję jej wartość ? Zmieniając wartość myInt przy wyświetlaniu wartość boxedInt nie uległa zmianie. Jak w takim przypadku zmienić wartość obiektu boxedInt da się jakoś ?

0

Zmieniając wartość myInt przy wyświetlaniu wartość boxedInt nie uległa zmianie
wiec sam sobie odpowiedziales na pytanie, ze nie przekazujesz referencji a jej wartosc. Dlatego Boxowanie jest tez drogie bo musisz zrobic taki wrapper

Jak w takim przypadku zmienić wartość obiektu boxedInt da się jakoś
przypisz po prostu jakas wartosc, znowu zrobi sie boxowanie z tego

http://ideone.com/szr5QT

pamietaj, ze boxowanie jest kosztowne i mozna sie go pozbyc w niektorych przypadkach. Ale to odbiega od tematu

0

Ok, dzięki. Typów generycznych używa się aby uniknąć boxingu i unboxingu.

0

Obiekt (specjalnie użyłem tego określenia) typu int (nie klasy) leży na stosie. A takie obiekty przekazywane są przez wartość.
Tworząc zmienna wprost z typu Object jest ona typem referencyjnym i jego wartość ma być na stercie (na stosie jedynie "wskaźnik");

Mając funkcje (int) przekazywany jest do niej kopia wartości ze stosu...czyli wartość "komórki".
"Podobnie" jest w funkcja przyjmującą type referencyjny... tez jest kopia wartości stosu...tylko akurat to adres :)
Do funkcji jest przekazywany wskaźnik... a dokładnie...kopia wartości wskaźnika.
(i tu i tu jest przekazywanie przez wartość... tylko co innego "wartość" oznacza :)).
W przypadku obiektu wywodzącego się z Value Type ta wartość jest brana bezpośrednio, zaś w innym przypadku, pobrana wartość jest traktowana
jako adres pamięci na stercie.

Dlatego mając funkcje przyjmującą Object, a wywołując ja z "intem" musi przejść przez boxing.
Po prostu funkcja oczekuje adresu a nie konkretnej wartości. Cala tajemnica :)

Aby to zrozumieć fajnie sobie rozrysować na komórki pamieć na stosie i na stercie.
Np:
http://www.csharpstar.com/difference-between-boxing-and-unboxing-in-c/
https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types

można sobie to rozrysować jeszcze lepiej, tak aby były adresy komórek a nie strzałki.

W większości książek i 95% kursów, temat jest albo omijany aby upraszczany.
Podejrzewam ze wynika to z faktu, że nie autorzy nie chcą tracić "czytelników" nie rozumiejących zagadnień stosu, sterty, wskaźnika, procesu de-referencji.
Niestety (i myślę ze wiele osób sie z tym zgodzi), nie sposób dobrze programować w C# nie czując co jest "pod maska". i jak naprawdę to działa.

P

ps. pisałem na szybko, ale może nigdzie się nie pomylilem

0
fprogrammer napisał(a):

W większości książek i 95% kursów, temat jest albo omijany aby upraszczany.
Podejrzewam ze wynika to z faktu, że nie autorzy nie chcą tracić "czytelników" nie rozumiejących zagadnień stosu, sterty, wskaźnika, procesu de-referencji.

No niestety chcą i to robią. Zupełnie niepotrzebnie, bo początkującemu to niczego nie wyjaśnia, co najwyżej później powtarza bzdury.

  1. Typy wartościowe od referencyjnych różnią się tym, że są przekazywane przez wartość, a nie przez referencje. Tylko i wyłącznie tym. To, czy dane siedzą sobie na stosie, czy w stercie, zależy od sytuacji. To szczegół implementacji, który niczego nie wyjaśnia, a jedynie utrudnia zrozumienie.
  2. Referencja to nie jest wskaźnik, wskaźników w C# używa się inaczej i w innym kontekście. To, że referencje są adresami to znowu szczegół implementacji, który nie ma żadnego znaczenia i niczego nie wyjaśnia, a właściwie utrudnia zrozumienie tematu. (Bo wymaga rozumienia modelu pamięci, który do działania przekazywania przez referencje jest po prostu zmienny.)
0
Nieposkromiony Ogrodnik napisał(a):
            int myInt = 25;
            object boxedInt = myInt; 

Zmienna myInt jest na stosie. Zmienna boxedInt również, ale wskazuje na nową wartość zaalokowaną na stercie.
Boxing tworzy zawsze kopię wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1