2012-04-14 5 views
5

Я пытался понять этот пункт, но почему-то я не мог виртуализировать это на мой взгляд, некоторые один просьба уточнить это немного:распаковка Значения Типы от объектов

распаковка не точная противоположность бокса. Операция распаковки намного дешевле, чем бокс. Unboxing - это действительно операция получения указателя на тип необработанного значения (поля данных), содержащегося в объекте . Фактически, указатель ссылается на незапакованную часть в экземпляре в штучной упаковке. Таким образом, в отличие от бокса, unboxing не включает в себя копирование любых байтов в памяти. Сделав это важное разъяснение , важно отметить, что операция распаковки - , за которой следует копирование полей.

Richter, Jeffrey (2010-02-05). CLR через C# (Kindle Locations 4167-4171). OReilly Media - A. Kindle Edition.

+0

имел точно такой же вопрос при чтении к абзацу – zinking

ответ

6

Для того, чтобы вставить int, вам нужно создать объект в куче, достаточно большой, чтобы хранить все данные, хранящиеся в структуре. Выделение нового объекта в куче означает работу GC, чтобы найти пятно, и работать для GC, чтобы очистить его/переместить его во время и после его жизни. Эти операции, в то время как не супер дорого, не дешево.

Чтобы удалить тип значения, все, что вы делаете, является де-ссылкой на указатель, так сказать. Вам просто нужно посмотреть ссылку (это то, что у вас есть object), чтобы найти местоположение фактических значений. Выглядеть ценность в памяти очень дешево, поэтому этот параграф говорит, что «распаковка» дешева.

Update:

Хотя распакованный тип значения, как правило, будут скопированы в другое место сразу же после того, как распакованный, что это не всегда так. Рассмотрим следующий пример:

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

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

MyStruct упаковывается в obj но когда это распакованный он никогда не скопирована в любом месте, метод просто вызывается на него. LIkewise вы можете вытащить свойство/поле из структуры и скопировать только ту часть его, не копируя все это. Это может показаться немного надуманным, но это все еще не совсем абсурдно. Тем не менее, как следует из вашей цитаты, он все же может скопировать структуру после того, как вы ее распакуете.

+0

Но после того, как он найдет значения, значения будут скопированы обратно в Stack, это правильно? – Tarik

+0

@Braveyard Нет, это не так. Весьма распространено, что после того, как значение будет распаковано, оно будет скопировано, но это не обязательно. Кроме того, он не может быть скопирован обратно в стек, его можно скопировать в поле некоторого другого ссылочного типа в куче. – Servy

+0

Я добавил образец кода в ответ. – Servy