2016-09-18 8 views
0

Рихтера «CLR через C#» известной книгиUnboxing. Копирование полей стека в большинстве случаев

Я понимаю, когда у распаковка, она возвращает указатель на Unboxed значение на куче, но я не могу получить указатель в C#, так что копия полей из кучи в стек сделан (ответ here).

Но, когда я делаю

Console.WriteLine(v + ", " + (Int32)o); 

так, когда я делаю распаковка объекта «о», только указатель передается без копии. «... Это требует распаковки операции (но без операции копирования) ...» (Рихтер, стр 129)

Теперь мой вопрос: когда возвращает указатель на Unboxed значение в куче, и когда он также копируется в стек?

Благодаря

P.S .: Код:

 Int32 v = 5; 
     Object o = v; 
     Console.WriteLine(v + ", " + (Int32)o); 
+0

Код скопирован дословно из книги Рихтера (минус 1 строка) и скомпилирован в обычном режиме. – Philippe

ответ

1

unbox сама не копирует значение. Но значение все же копируется, когда оно используется. В вашем примере из книги Рихтера операция box, которая сразу же следует, копирует значение в новое значение в коробке.

+0

Привет, Филипп! Спасибо за ответ, но мой вопрос: при выполнении распаковки при копировании значения, а когда нет Спасибо – zzfima

+0

@zzfima Значение никогда не копируется ** при ** распаковке, но оно почти всегда копируется ** после **, при использовании Значение. Я не знаю ни одного кода на C#, который бы скомпилировался в 'unbox', за которым не следовало какое-то копирование (даже« небезопасный »код с оператором' & '), но вы могли бы сделать это прямо в IL. – Philippe

+0

в моем примере «Console.WriteLine (v +», «+ (Int32) o)» Рихтер сказал, что при распаковке «o» он не копируется, только указатель возвращает – zzfima