Типы данных в C# обычно можно разделить на два типа, а именно. типы значений и ссылочные типы. Ссылочный тип сохраняет адрес значения, где оно хранится, но тип значения сохраняет сам элемент.

Типы значений включают int, float, double, decimal, bool, char и другие, а ссылочные типы включают объект, строку и массив. При работе с этими типами данных вам часто потребуется преобразовывать типы значений в ссылочные типы или наоборот.

Потому что они имеют разные функции и по-разному хранятся в памяти. NET должен выполнить некоторую внутреннюю работу, чтобы преобразовать их из одного типа в другой. Упаковка и распаковка являются инструментами для этих процедур преобразования. Итак, давайте быстро разберемся, что такое упаковка и распаковка в C#.

Оглавление

  1. Что такое бокс в C#?
  2. Пример упаковки в C#
  3. Почему эта концепция называется боксом?
  4. Что такое распаковка в C#?
  5. Пример распаковки в C#
  6. Ключевые различия между упаковкой и распаковкой в ​​C#
  7. Вывод

Что такое бокс в C#?

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

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

Вот простой пример:

Объявите переменную типа значения (num) целочисленного типа и присвойте ей любое значение. Создайте ссылочный тип объекта (obj) и примените операцию Explicit, в результате чего числовой тип значения будет скопирован и сохранен в объектном ссылочном типе obj, как показано ниже:

Пример упаковки в C#

Ниже приведена программа для изображения бокса на C#:

Вывод:

Почему эта концепция называется боксом?

Как вы, наверное, хорошо знаете, все ссылочные типы, хранящиеся в куче, содержат адрес значения. Тип значения — это просто фактическое значение, помещенное в стек. Int I теперь выделен объекту o (как видно из первого примера). Объект o должен быть адресом, а не значением. В результате CLR создает новую систему для упаковки типа значения. Весь процесс называется «упаковкой», потому что CLR создает коробку в куче, в которой хранится элемент.

Что такое распаковка в C#?

Как следует из названия, распаковка — это полная противоположность упаковке. Это преобразование ссылочного типа в тип значения. Значение из ссылочного типа извлекается и присваивается типу значения посредством распаковки. Акт распаковки является явным. Это требует специального литья.

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

  • Проверка того, является ли экземпляр объекта упакованным значением указанного типа значения.
  • Значение экземпляра копируется в переменную типа значения.

Вот простой пример:

Объявить переменную типа значения (num) целочисленного типа, хранящую значение. Создайте ссылочный тип объекта сейчас (obj). Явный процесс упаковки создает целочисленное значение типа I и использует метод приведения. Затем указанный тип в куче копируется в стек, как показано на диаграмме ниже:

Пример распаковки в C#

Ниже приведен пример распаковки в C#:

Вывод:

Основные различия между упаковкой и распаковкой в ​​C#

Заниматься боксом

  • Он используется для преобразования типа значения в тип объекта.
  • Бокс — это форма неявного преобразования
  • Значение в стеке копируется в объект в куче памяти

Пример бокса-

// C# program to illustrate Boxing using System; public class example { static public void Main() { ​ int value = 20; ​ // Boxing ​ object obj = value; ​ // Change the value of val ​ value = 30; ​ Console.WriteLine("Value type of value is {0}", value); ​ Console.WriteLine("Object type of value is {0}", obj); } }

Вывод

Распаковка

  • Он преобразует тип объекта в тип значения
  • Распаковка — это форма явного преобразования
  • Элемент из кучи памяти копируется в значение из памяти стека

Пример распаковки в C#

// C# program to illustrate Unboxing using System; public class example { static public void Main() { ​ int value = 20; ​ // Boxing ​ object obj = value; ​ // Unboxing ​ int a = (int)obj; ​ Console.WriteLine("Value of object is {0}", obj); ​ Console.WriteLine("Value of a is {0}", a); }

}

Вывод

Вывод

Подумайте об этом так: значения Int — это просто 32-битные числа для приложений, которым не требуются значения int для работы в качестве объектов. Возможность рассматривать типы значений как объекты устраняет существующий в большинстве языков разрыв между типами значений и ссылочными типами. Эта функциональность доступна по требованию для программ, требующих, чтобы значения int вели себя как объекты.

Первоначально опубликовано на https://www.partech.nl.