2012-04-14 27 views
5

Próbowałem zrozumieć ten punkt, ale jakoś nie mogłem wirtualizacji w moim umyśle, ktoś proszę opracować ją nieco:unboxing Wartości Typy od obiektów

Unboxing nie jest dokładnym przeciwieństwem boksowania. Operacja rozpakowywania jest znacznie mniej kosztowna niż boksowanie. Unboxing to tak naprawdę operacja polegająca na uzyskaniu wskaźnika do typu wartości surowych (pól danych) zawartych w obiekcie w postaci . W rezultacie wskaźnik odnosi się do niezakodowanej części w pudełkowej instancji. W przeciwieństwie do boksowania, rozpakowanie nie wymaga kopiowania dowolnych bajtów w pamięci. Po dokonaniu tego ważnego wyjaśnienia należy zauważyć, że operacja rozpakowywania to zwykle , po której zwykle następuje kopiowanie pól.

Richter, Jeffrey (2010-02-05). CLR za pośrednictwem C# (Kindle Locations 4167-4171). OReilly Media - A. Kindle Edition.

+0

miał dokładnie to samo pytanie podczas czytania do akapitu – zinking

Odpowiedz

6

Aby wstawić int, należy utworzyć obiekt na stercie o wielkości wystarczającej do przechowywania wszystkich danych przechowywanych w strukturze. Przydzielenie nowego obiektu na stercie oznacza pracę dla GC, aby znaleźć miejsce i pracować dla GC, aby go oczyścić/przenieść w czasie i po jego zakończeniu. Te operacje, chociaż nie są kosztowne, nie są również tanie.

Aby rozpakować typ wartości, wszystko co robisz, to odreagowanie wskaźnika. Wystarczy spojrzeć na referencję (która jest tym, czym jest object), aby znaleźć lokalizację rzeczywistych wartości. Szukanie wartości w pamięci jest bardzo tanie, dlatego ten akapit mówi, że "rozpakowywanie" jest tanie.

Aktualizacja:

Podczas gdy typ wartości unboxed będą zwykle kopiowane do innej lokalizacji tuż po tym rozpakowanych, że nie zawsze tak jest. Rozważmy następujący przykład:

public struct MyStruct 
{ 
    private int value = 42; 
    public void Foo() 
    { 
    Console.WriteLine(value); 
    } 
} 

static void Main() 
{ 
    object obj = new MyStruct(); 
    ((MyStruct)obj).Foo(); 
} 

MyStruct jest zapakowane w obj ale kiedy nadszedł unboxed to nigdy nie skopiowane nigdzie, metoda jest wywoływana po prostu na nim. LIkewise można pobrać właściwość/pole ze struktury i skopiować tylko tę część bez konieczności kopiowania całej rzeczy. Może to wyglądać nieco wymyślnie, ale nadal nie jest całkowicie absurdalne. To powiedziawszy, jak sugeruje twój cytat, nadal możliwe jest skopiowanie struktury po jej rozpakowaniu.

+0

Ale po znalezieniu wartości, wartości zostaną skopiowane z powrotem do stosu, czy to prawda? – Tarik

+0

@ Braveyard Nie, nie jest. Często zdarza się, że gdy wartość zostanie rozpakowana, zostanie skopiowana, ale nie musi być. Dodatkowo nie może być skopiowany z powrotem do stosu, może być skopiowany do pola innego typu referencyjnego na stercie. – Servy

+0

Dodałem próbkę kodu do odpowiedzi. – Servy

Powiązane problemy