В чем разница между боксом/распаковкой и типом литья?
Часто термины, по-видимому, используются взаимозаменяемо.
В чем разница между боксом/распаковкой и типом литья?
Часто термины, по-видимому, используются взаимозаменяемо.
Бокс ссылается на преобразование типа с нулевым значением в ссылочный тип или преобразование типа значения в некоторый интерфейс, который он реализует (скажем 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
.
Бокс и распаковка - это подмножество типов. Бокс - это акт обработки типа значения в качестве ссылочного типа (который на практике предполагает копирование содержимого этого типа значений (из стека) в кучу и возврат ссылки на этот объект). Это позволяет передавать тип значения везде, где ожидается совместимый ссылочный тип. Он также позволяет выполнять вызовы виртуальных методов и другие функции ссылочных типов по типу значения. Unboxing - это обратная операция (возврат типа значения из объекта в коробке).
Тип cast - это термин, используемый для любого типа преобразования из переменной определенного типа в другой. Это более широкая концепция.
Несколько минут назад Я ответил на соответствующий вопрос, который охватывает эту разницу. Подводя итог, я классифицировал различные типы инструкций IL, сгенерированных оператором С# cast:
box
IL-инструкция) и распаковка (unbox
IL-команда)dynamic_cast<Type>
в С++ использует проверку castclass
IL)static_cast<Type>
в С++, существует множество инструкций IL для разных типов отбрасываний между примитивными типами)op_XXX
).Бокс - это термин для превращения типа значения (int, double, float, Guid и т.д.) в ссылочный тип (System.Object, System.String и т.д.). Выполнение этой операции бокса выделяет память на кучу (которую сборщик мусора в конечном итоге должен будет вернуть). Unboxing обратный этому процессу, используя ссылочный тип и превращая его в тип значения.
Кастинг принимает тип (скажем, System.Object) и рассматривает его как другой тип (скажем, System.String).
Когда вы помещаете что-то в С#, вы переводите его в другой тип. Разница в том, что он выделяет дополнительную память при создании нового ссылочного типа.
Нижняя строка: бокс - это особый вид приведения, который преобразует тип значения в ссылочный тип, который требует выделения нового ссылочного типа.
Бокс/распаковка и литье типов - это две разные операции, однако они используют один и тот же синтаксис.
Они используются только взаимозаменяемо, когда человек, говорящий об этом, не знает, что на самом деле происходит...
Бокс сохраняет тип значения как объект в куче, а unboxing считывает значение из объекта. Вы можете только удалить значение в виде точного типа.
Кастинг - это преобразование базового типа в другой базовый тип (например, от int
до long
) или при изменении типа ссылки (например, от List<int>
до IEnumerable<int>
).
Бокс означает преобразование переменной типа значения (т.е. целого) в ссылочный тип. 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
Вывод из этого является унификацией системы типов, позволяющей рассматривать типы значений как ссылочные типы. В этой статье более глубокий взгляд на бокс/распаковку.