Разработка компиляторов

       

Пример упаковки и распаковки


Пример упаковки и распаковки

public static void Main() { Int32 v = 5; // creating unboxed value type variable Object o = v; // o refers to boxed version of v v = 123; // changes the unboxed value to 123

Console.WriteLine (v + "," + (Int32) o); // displays "123, 5" }

Вопрос: сколько раз в данном примере производится операция упаковки?

Правильный ответ: операция упаковки производится ровно 3 раза. Дополнительная операция возникает внутри Console.WriteLine, так как оператор '+' означает неявный вызов метода Concat, который ожидает переменные типа Object в качестве параметров. Мы же перед выводом на печать приводим объектную переменную к типу Int32 (т.е. к типу-значению). Для того, чтобы тип-значение мог быть использован в методе Concat, он должен быть приведен обратно в ссылочный вид.

Итак, в данном примере после последнего плюса мы имеем и упаковки, и распаковку. Конечно, это неэффективно, поэтому грамотнее было бы записать последний оператор в следующем виде:

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

При этом результаты вывода не изменятся, а эффективность возрастет за счет избавления от лишних операций упаковки и распаковки.

Интересно, что если бы мы не пытались напечатать строку, составленную из нескольких параметров, то лишних операций удалось бы избежать и в примере на слайде, т.к. метод WriteLine может принимать и значения типа Int32.



Содержание раздела