что такое boxing и unboxing c

BestProg

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

Содержание

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

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

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

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

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

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

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

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

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

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

что такое boxing и unboxing c. 02 02 02 18 05 01r. что такое boxing и unboxing c фото. что такое boxing и unboxing c-02 02 02 18 05 01r. картинка что такое boxing и unboxing c. картинка 02 02 02 18 05 01r.

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

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

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

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

что такое boxing и unboxing c. 02 02 02 18 05 02r. что такое boxing и unboxing c фото. что такое boxing и unboxing c-02 02 02 18 05 02r. картинка что такое boxing и unboxing c. картинка 02 02 02 18 05 02r.

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

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

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

что такое boxing и unboxing c. 02 02 02 18 05 03r. что такое boxing и unboxing c фото. что такое boxing и unboxing c-02 02 02 18 05 03r. картинка что такое boxing и unboxing c. картинка 02 02 02 18 05 03r.

Источник

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

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

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

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

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

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

Упаковка

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

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

что такое boxing и unboxing c. boxing operation i o variables. что такое boxing и unboxing c фото. что такое boxing и unboxing c-boxing operation i o variables. картинка что такое boxing и unboxing c. картинка boxing operation i o variables.

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

Пример

Распаковка

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

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

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

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

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

что такое boxing и unboxing c. unboxing conversion operation. что такое boxing и unboxing c фото. что такое boxing и unboxing c-unboxing conversion operation. картинка что такое boxing и unboxing c. картинка unboxing conversion operation.

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

Пример

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

Specified cast is not valid. Error: Incorrect unboxing.

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

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

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

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

Источник

что такое boxing и unboxing c. c58d6401 7948 4ef3 96f0 8cbde7434096 cover. что такое boxing и unboxing c фото. что такое boxing и unboxing c-c58d6401 7948 4ef3 96f0 8cbde7434096 cover. картинка что такое boxing и unboxing c. картинка c58d6401 7948 4ef3 96f0 8cbde7434096 cover.

что такое boxing и unboxing c. itvdn authors 13edf98e 6eae 4f93 91b9 44ddb7293dd8. что такое boxing и unboxing c фото. что такое boxing и unboxing c-itvdn authors 13edf98e 6eae 4f93 91b9 44ddb7293dd8. картинка что такое boxing и unboxing c. картинка itvdn authors 13edf98e 6eae 4f93 91b9 44ddb7293dd8.

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

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

что такое boxing и unboxing c. cbs images fcfd7933 c158 48f5 81b7 3cc4f45d125c. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images fcfd7933 c158 48f5 81b7 3cc4f45d125c. картинка что такое boxing и unboxing c. картинка cbs images fcfd7933 c158 48f5 81b7 3cc4f45d125c.

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

что такое boxing и unboxing c. cbs images e3cc4907 cf93 46fe 86c4 2aa479680a77. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images e3cc4907 cf93 46fe 86c4 2aa479680a77. картинка что такое boxing и unboxing c. картинка cbs images e3cc4907 cf93 46fe 86c4 2aa479680a77.

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

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

что такое boxing и unboxing c. cbs images 4f4277c4 7bdd 4710 8f32 c7036d405747. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 4f4277c4 7bdd 4710 8f32 c7036d405747. картинка что такое boxing и unboxing c. картинка cbs images 4f4277c4 7bdd 4710 8f32 c7036d405747.

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

что такое boxing и unboxing c. cbs images ce8b2608 0dfb 4dc9 8c17 b7d9c3e19539. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images ce8b2608 0dfb 4dc9 8c17 b7d9c3e19539. картинка что такое boxing и unboxing c. картинка cbs images ce8b2608 0dfb 4dc9 8c17 b7d9c3e19539.

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

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

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

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

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

что такое boxing и unboxing c. cbs images 7524ba1c d4de 46d7 b0ca d3ed25d38a73. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 7524ba1c d4de 46d7 b0ca d3ed25d38a73. картинка что такое boxing и unboxing c. картинка cbs images 7524ba1c d4de 46d7 b0ca d3ed25d38a73.

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

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

что такое boxing и unboxing c. cbs images 3f341759 067c 4414 84b3 6fd6fa2dbc5a. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 3f341759 067c 4414 84b3 6fd6fa2dbc5a. картинка что такое boxing и unboxing c. картинка cbs images 3f341759 067c 4414 84b3 6fd6fa2dbc5a.

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

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

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

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

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

что такое boxing и unboxing c. cbs images 59de9659 55f1 4f5e 8cc0 0f626fc7e9cc. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 59de9659 55f1 4f5e 8cc0 0f626fc7e9cc. картинка что такое boxing и unboxing c. картинка cbs images 59de9659 55f1 4f5e 8cc0 0f626fc7e9cc.

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

что такое boxing и unboxing c. cbs images a6328726 38f6 4d0e 92c1 6c918a807633. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images a6328726 38f6 4d0e 92c1 6c918a807633. картинка что такое boxing и unboxing c. картинка cbs images a6328726 38f6 4d0e 92c1 6c918a807633.

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

что такое boxing и unboxing c. cbs images dba76171 4e84 460d aac8 4fdf77359cd3. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images dba76171 4e84 460d aac8 4fdf77359cd3. картинка что такое boxing и unboxing c. картинка cbs images dba76171 4e84 460d aac8 4fdf77359cd3.

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

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

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

что такое boxing и unboxing c. cbs images 490a5bd4 047d 40ba 89fb e380312d5d38. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 490a5bd4 047d 40ba 89fb e380312d5d38. картинка что такое boxing и unboxing c. картинка cbs images 490a5bd4 047d 40ba 89fb e380312d5d38.

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

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

что такое boxing и unboxing c. csharp basic img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-csharp basic img. картинка что такое boxing и unboxing c. картинка csharp basic img.

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

что такое boxing и unboxing c. procedural programming csharp img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-procedural programming csharp img. картинка что такое boxing и unboxing c. картинка procedural programming csharp img.

что такое boxing и unboxing c. how to csharp prof img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-how to csharp prof img. картинка что такое boxing и unboxing c. картинка how to csharp prof img.

How to C# Углубленный

что такое boxing и unboxing c. cbs images b264eb95 e092 43ca b377 52b442b174cf. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images b264eb95 e092 43ca b377 52b442b174cf. картинка что такое boxing и unboxing c. картинка cbs images b264eb95 e092 43ca b377 52b442b174cf.

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

что такое boxing и unboxing c. cbs images 97c7c808 140c 4c3e b021 093e0b1b05fa. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 97c7c808 140c 4c3e b021 093e0b1b05fa. картинка что такое boxing и unboxing c. картинка cbs images 97c7c808 140c 4c3e b021 093e0b1b05fa.

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

что такое boxing и unboxing c. cbs images 7f6e176e c645 454a 97f5 4a6510eb438d. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 7f6e176e c645 454a 97f5 4a6510eb438d. картинка что такое boxing и unboxing c. картинка cbs images 7f6e176e c645 454a 97f5 4a6510eb438d.

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

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

что такое boxing и unboxing c. cbs images 3c30d8ec d2ba 41d2 8fbb 968df36ba6f3. что такое boxing и unboxing c фото. что такое boxing и unboxing c-cbs images 3c30d8ec d2ba 41d2 8fbb 968df36ba6f3. картинка что такое boxing и unboxing c. картинка cbs images 3c30d8ec d2ba 41d2 8fbb 968df36ba6f3.

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

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

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

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

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

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

что такое boxing и unboxing c. webapi exp img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-webapi exp img. картинка что такое boxing и unboxing c. картинка webapi exp img.

Практический опыт миграции с Web API на микросервисную архитектуру

что такое boxing и unboxing c. become net dev img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-become net dev img. картинка что такое boxing и unboxing c. картинка become net dev img.

Как стать C#/.NET разработчиком?

что такое boxing и unboxing c. dotnet map img. что такое boxing и unboxing c фото. что такое boxing и unboxing c-dotnet map img. картинка что такое boxing и unboxing c. картинка dotnet map img.

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

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

Источник

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

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

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

что такое boxing и unboxing c. H3Njv. что такое boxing и unboxing c фото. что такое boxing и unboxing c-H3Njv. картинка что такое boxing и unboxing c. картинка H3Njv.

3 ответа 3

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

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

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

что такое boxing и unboxing c. K9VA7. что такое boxing и unboxing c фото. что такое boxing и unboxing c-K9VA7. картинка что такое boxing и unboxing c. картинка K9VA7.

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

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

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

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

что такое boxing и unboxing c. photo. что такое boxing и unboxing c фото. что такое boxing и unboxing c-photo. картинка что такое boxing и unboxing c. картинка photo.

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

Связанные

Похожие

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

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

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

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

Источник

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 c. boxing operation i o variables. что такое boxing и unboxing c фото. что такое boxing и unboxing c-boxing operation i o variables. картинка что такое boxing и unboxing c. картинка boxing operation i o variables.

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 c. unboxing conversion operation. что такое boxing и unboxing c фото. что такое boxing и unboxing c-unboxing conversion operation. картинка что такое boxing и unboxing c. картинка unboxing conversion operation.

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.

Источник

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

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