Что такое boxing unboxing

BestProg

Упаковка и распаковка. Необходимость (преимущества) применения обобщений. Повышение типовой безопасности с помощью обобщений

Содержание

Поиск на других ресурсах:

1. Понятие упаковки (boxing) и распаковки (unboxing)

Допускается также использовать переменную типа object в правой части оператора присваивания:

Но в этом случае нужно указывать явное приведение типов, как видно из строки

иначе будет ошибка на этапе компиляции.

Если переменная типа object используется в левой части оператора присваивания, то компилятор выполняет так называемую упаковку. Если переменная или значение типа object используется в правой части оператора присваивания, то компилятор выполняет распаковку.

Использование обобщений вместо использования типа object дает следующие преимущества:

В следующих пунктах эти преимущества рассматриваются более подробно.

2.1. Преимущество 1. Отсутствие явного приведения типа

Если используется обобщение, то не нужно выполнять явное приведение типов в операции присваивания как показано на рисунке 1.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Рисунок 1. Отличие в явном приведении к типу int между обобщением и типом object

2.2. Преимущество 2. Обеспечение типовой безопасности в обобщениях

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

В случае с классом ObjectClass ошибки на этапе компиляции не возникает. Эта ошибка вызовет исключительную ситуацию на этапе выполнения.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Рисунок 2. Особенности выявления ошибки компилятором для обобщенного и необобщенных класса

2.3. Преимущество 3. Повышение производительности

Использование обобщенных классов дает большую производительность (быстродействие) по сравнению с необобщенными. При присвоении значения типа object другим типам и наоборот, компилятор выполняет упаковку и распаковку (смотрите п. 1). Этот процесс требует больше временных затрат чем использование обобщений. В случае с обобщениями формируется типизированный код с привязкой к конкретному типу, который выполняется быстрее.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Источник

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Что такое упаковка и распаковка?

К примеру, здесь мы имеем следующий пример упаковки:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

А вот состояние памяти в момент произведения операции:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Чтобы сохранить значение «123» в виде объекта, в куче создается «упаковка», куда впоследствии и перемещаются данные.

Когда же производится распаковка:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Вот что происходит с памятью:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Значение «123» было изъято из упаковки и помещено назад в область стека.

Как вы можете себе представить, сии операции могут быть достаточно ресурсоемкими.

Тема связана со специальностями:

Давайте рассмотрим IL

Когда мы производим подобный анализ производительности, часто бывает полезно заглянуть непосредственно в Intermediate Language (IL).

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Теперь скомпилируем приложение и при помощи утилитки ILSpy посмотрим его код внутри EXE.

Как только EXE-файл будет открыт в ILSpy, пронавигируемся к методу Main, выбрав «IL with C#».

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Это де-факто способ, которым операции упаковки и распаковки представлены в IL.

Когда стоит производить упаковку и распаковку?

Код в примере выше скорее всего вам покажется наивным, и вы можете подумать: «Эй, что за вздор! Я никогда не буду такого делать». Что же, в большинстве случаев это действительно так. Но данные в нашем приложении часто упаковываются и распаковываются, когда мы об этом даже не догадываемся.

Гетерогенные коллекции

К примеру, старая школа до сих пор может похвастаться ArrayList.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Метод добавления элемента здесь, как можно отметить, принимает object-параметр.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Таким образом, и здесь производится наша излюбленная упаковка.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Впрочем, подобное кануло в лету с приходом обобщений и обобщенных коллекций.

Конкатенация строк

Другой интересный пример в виде конкатенации строк.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Эта операция требует наличия метода String.Concat, который принимает два object-параметра.

Видео курсы по схожей тематике:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Автоматизация тестирования на С#

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

C# Базовый (ООП) 2021

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Дабы избежать подобных ситуаций, нам достаточно просто немного изменить код, используя на переменной типа int метод ToString (и здесь стоит проигнорировать сообщение ReSharper о том, что операция бессмысленна:) ).

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

И все! Никакой упаковки больше нет.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Производительность

Как мы уже говорили, упаковка и распаковка требуют определенных затрат производительности. В случае с конкатенацией строк, выигрыш от применения ToString весьма незначителен. Именно потому, как я упомянул выше, даже ReSharper не советовал нам делать подобное:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

В этом случае гораздо лучше сохранить читабельность кода без ToString.

Целесообразность оптимизации появляется, как правило, тогда, когда операции упаковки и распаковки предстоит производить в цикле сотни и тысячи раз. В этом случае время выполнения кода с упаковкой может составлять порядка 150 процентов от времени исполнения кода без нее (вы можете сами создать тестовое приложение и сравнить требуемый промежуток времени).

Упакованные значения могут также требовать больше памяти, чем значения в стеке. Копирование значений в/из стека также требует своих затрат. Согласно MSDN, упаковка может занимать порядка 20 раз больше времени, нежели простое присвоение. В то время как распаковка примерно в 4 раза медленней простого присвоения.

Итак. зачем же тогда вообще нужно использовать упаковку и распаковку?

Упаковка и распаковка настолько распространены, что мы не может избежать их полностью. Мы должны знать принцип их работы, чтобы минимизировать их использование, но к этому нужно подходить разумно. Не тратьте свое время на постоянную оптимизацию кода, частую проверку через IL, чтобы убедиться, дабы ни одна лишняя операция упаковки не была использована. Помните, что чистота и простота чтения кода иногда значительно более важна, нежели незаметное, мельчайшее ускорение работы программы.

Бесплатные вебинары по схожей тематике:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Микросервисная архитектура. Практика применения

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Пятнашки на C# для Android

Подведем итоги

В сегодняшнем уроке мы рассмотрели, что такое упаковка и распаковка, как она представлена в IL-коде, и какое влияние на производительность они имеют. Искренне надеюсь, моя статья сумела прояснить некоторые общие концепции, хотя бы чуть-чуть. 🙂

Источник

Boxing and Unboxing (C# Programming Guide)

Boxing is the process of converting a value type to the type object or to any interface type implemented by this value type. When the common language runtime (CLR) boxes a value type, it wraps the value inside a System.Object instance and stores it on the managed heap. Unboxing extracts the value type from the object. Boxing is implicit; unboxing is explicit. The concept of boxing and unboxing underlies the C# unified view of the type system in which a value of any type can be treated as an object.

The object o can then be unboxed and assigned to integer variable i :

The following examples illustrate how boxing is used in C#.

Performance

In relation to simple assignments, boxing and unboxing are computationally expensive processes. When a value type is boxed, a new object must be allocated and constructed. To a lesser degree, the cast required for unboxing is also expensive computationally. For more information, see Performance.

Boxing

Boxing is used to store value types in the garbage-collected heap. Boxing is an implicit conversion of a value type to the type object or to any interface type implemented by this value type. Boxing a value type allocates an object instance on the heap and copies the value into the new object.

Consider the following declaration of a value-type variable:

The following statement implicitly applies the boxing operation on the variable i :

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

It is also possible to perform the boxing explicitly as in the following example, but explicit boxing is never required:

Example

Unboxing

Unboxing is an explicit conversion from the type object to a value type or from an interface type to a value type that implements the interface. An unboxing operation consists of:

Checking the object instance to make sure that it is a boxed value of the given value type.

Copying the value from the instance into the value-type variable.

The following statements demonstrate both boxing and unboxing operations:

The following figure demonstrates the result of the previous statements:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

For the unboxing of value types to succeed at run time, the item being unboxed must be a reference to an object that was previously created by boxing an instance of that value type. Attempting to unbox null causes a NullReferenceException. Attempting to unbox a reference to an incompatible value type causes an InvalidCastException.

Example

This program outputs:

Specified cast is not valid. Error: Incorrect unboxing.

If you change the statement:

the conversion will be performed, and you will get the output:

C# language specification

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

Источник

Что такое упаковка и распаковка(boxing/unboxing)?

Что это вообще такое упаковка и распаковка (boxing/unboxing) и зачем она нужна?

Был бы рад примерам.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

3 ответа 3

их нельзя помещать в коллекции и прочее.

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

В тех случаях, когда по контексту требуются объекты (присваивание, вызов метода с передачей параметров), а мы используем значения примитивных типов (переменные или выражения типа 2 * 3), всегда происходит автоупаковка.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

В версиях ниже JDK 1.5 было не легко преобразовывать примитивные типы данных, такие как int, char, float, double в их классы оболочки Integer, Character, Float, Double. Начиная с версии JDK 5 эта функция, преобразования примитивных типов в эквивалентные объекты, реализована автоматически. Это свойство известно как Автоупаковка(Autoboxing). Обратный процесс соответственно – Распаковка(Unboxing) т.е. процесс преобразования объектов в соответствующие им примитивные типы.

Пример кода для автоупаковки и распаковки представлен ниже:

Когда используется автоупаковка и распаковка?

Автоупаковка применяется компилятором Java в следующих условиях:

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java java-faq или задайте свой вопрос.

Связанные

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.22.41046

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Упаковка-преобразование и распаковка-преобразование (Руководство по программированию на C#)

Упаковка представляет собой процесс преобразования типа значения в тип object или в любой другой тип интерфейса, реализуемый этим типом значения. Когда тип значения упаковывается общеязыковой средой выполнения (CLR), он инкапсулирует значение внутри экземпляра System.Object и сохраняет его в управляемой куче. Операция распаковки извлекает тип значения из объекта. Упаковка является неявной; распаковка является явной. Понятия упаковки и распаковки лежат в основе единой системы типов C#, в которой значение любого типа можно рассматривать как объект.

Затем можно выполнить операцию распаковки объекта o и присвоить его целочисленной переменной i :

Следующий пример иллюстрирует использование упаковки в C#.

Производительность

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

Упаковка

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

Рассмотрим следующее объявление переменной типа значения.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Можно также выполнять упаковку явным образом, как в следующем примере, однако явная упаковка не является обязательной.

Пример

Распаковка

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

проверка экземпляра объекта на то, что он является упакованным значением заданного типа значения;

копирование значения из экземпляра в переменную типа значения.

В следующем коде показаны операции по упаковке и распаковке.

На рисунке ниже представлен результат выполнения этого кода.

Что такое boxing unboxing. Смотреть фото Что такое boxing unboxing. Смотреть картинку Что такое boxing unboxing. Картинка про Что такое boxing unboxing. Фото Что такое boxing unboxing

Для успешной распаковки типов значений во время выполнения необходимо, чтобы экземпляр, который распаковывается, был ссылкой на объект, предварительно созданный с помощью упаковки экземпляра этого типа значения. Попытка распаковать null создает исключение NullReferenceException. Попытка распаковать ссылку на несовместимый тип значения создает исключение InvalidCastException.

Пример

При выполнении этой программы выводится следующий результат:

Specified cast is not valid. Error: Incorrect unboxing.

При изменении оператора:

будет выполнено преобразование со следующим результатом:

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *