Подтвердить что ты не робот

В чем разница между боксом/распаковкой и типом литья?

В чем разница между боксом/распаковкой и типом литья?

Часто термины, по-видимому, используются взаимозаменяемо.

4b9b3361

Ответ 1

Бокс ссылается на преобразование типа с нулевым значением в ссылочный тип или преобразование типа значения в некоторый интерфейс, который он реализует (скажем int - IComparable<int>). Кроме того, преобразование базового типа значения в тип с нулевым значением также является преобразованием бокса. (Предостережение: большинство обсуждений по этому вопросу игнорируют последние два типа преобразований.)

Например,

int i = 5;
object o = i;

преобразует i в экземпляр типа object.

Unboxing относится к явному преобразованию из экземпляра object или ValueType к типу с недействительным значением, преобразованию типа интерфейса в тип с недействительным значением (например, IComparable<int> to int). Кроме того, преобразование типа NULL в базовый тип также является преобразованием для распаковки. (Предостережение. Большинство обсуждений этого вопроса будут игнорировать последние два типа преобразований.)

Например,

object o = (int)5;
int i = (int)o;

преобразует целое число, помещенное в o в экземпляр типа int.

Листинг типа - это явное преобразование выражения в данный тип. Таким образом,

(type) expression

явно преобразует expression в объект типа type.

Ответ 2

Бокс и распаковка - это подмножество типов. Бокс - это акт обработки типа значения в качестве ссылочного типа (который на практике предполагает копирование содержимого этого типа значений (из стека) в кучу и возврат ссылки на этот объект). Это позволяет передавать тип значения везде, где ожидается совместимый ссылочный тип. Он также позволяет выполнять вызовы виртуальных методов и другие функции ссылочных типов по типу значения. Unboxing - это обратная операция (возврат типа значения из объекта в коробке).

Тип cast - это термин, используемый для любого типа преобразования из переменной определенного типа в другой. Это более широкая концепция.

Несколько минут назад Я ответил на соответствующий вопрос, который охватывает эту разницу. Подводя итог, я классифицировал различные типы инструкций IL, сгенерированных оператором С# cast:

  • Бокс (box IL-инструкция) и распаковка (unbox IL-команда)
  • Прохождение через иерархию inhertiance (например, dynamic_cast<Type> в С++ использует проверку castclass IL)
  • Листинг между примитивными типами (например, static_cast<Type> в С++, существует множество инструкций IL для разных типов отбрасываний между примитивными типами)
  • Вызов пользовательских операторов преобразования (на уровне IL они всего лишь вызовы методов для соответствующего метода op_XXX).

Ответ 3

Бокс - это термин для превращения типа значения (int, double, float, Guid и т.д.) в ссылочный тип (System.Object, System.String и т.д.). Выполнение этой операции бокса выделяет память на кучу (которую сборщик мусора в конечном итоге должен будет вернуть). Unboxing обратный этому процессу, используя ссылочный тип и превращая его в тип значения.

Кастинг принимает тип (скажем, System.Object) и рассматривает его как другой тип (скажем, System.String).

Когда вы помещаете что-то в С#, вы переводите его в другой тип. Разница в том, что он выделяет дополнительную память при создании нового ссылочного типа.

Нижняя строка: бокс - это особый вид приведения, который преобразует тип значения в ссылочный тип, который требует выделения нового ссылочного типа.

Ответ 4

Бокс/распаковка и литье типов - это две разные операции, однако они используют один и тот же синтаксис.

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

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

Кастинг - это преобразование базового типа в другой базовый тип (например, от int до long) или при изменении типа ссылки (например, от List<int> до IEnumerable<int>).

Ответ 5

Бокс означает преобразование переменной типа значения (т.е. целого) в ссылочный тип. Unboxing - это наоборот, используя литье типов. В мире .NET все происходит от типа "объект" в двух словах.

Например (пример С#):

int myInt = 0;                 // original variable (unboxed to begin with)
object boxed = myInt;          // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

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