Каково различие между упаковкой/распаковыванием и преобразованием типа?

Нет, это решение абсолютно правильное и очень минимальное.

Отметьте, однако, что это очень необычная ситуация: поскольку String обрабатывается специально в Java, даже "foo" на самом деле является String. Таким образом, в обычном коде нет необходимости разбивать строку на отдельные char и объединять их обратно.

Сравните это с C / C ++, где "foo" у вас есть пакет char, оканчивающийся нулевым байтом на одной стороне и string на другой стороне, и многие преобразования между ними обусловлены унаследованными методами.

67
задан 6 July 2009 в 02:17
поделиться

5 ответов

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

Например,

int i = 5;
object o = i;

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

] Распаковка означает явное преобразование из экземпляра объекта или ValueType в тип значения, не допускающего значения NULL, преобразование типа интерфейса в тип значения, не допускающего значения NULL ( например, от IComparable до int ). Дальше, преобразование типа, допускающего значение NULL, в базовый тип также является преобразованием распаковки. (Предостережение: большинство обсуждений этой темы игнорирует последние два типа преобразований.)

Например,

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

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

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

(type) expression

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

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

(type) expression

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

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

(type) expression

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

44
ответ дан 24 November 2019 в 14:42
поделиться

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

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

Несколько минут назад я ответил на связанный вопрос, который охватывает это различие . Подвести итоги, Выполнение этой операции упаковки выделяет память в куче (которую сборщик мусора в конечном итоге должен будет освободить). Распаковка - это процесс, обратный этому процессу, когда ссылочный тип превращается в тип значения.

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

1294] Когда вы упаковываете что-то в C #, вы преобразуете это в другой тип. Разница в том, что он выделяет дополнительную память по мере создания нового ссылочного типа .

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

взятие ссылочного типа и превращение его в тип значения.

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

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

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

взятие ссылочного типа и превращение его в тип значения.

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

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

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

19
ответ дан 24 November 2019 в 14:42
поделиться

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

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

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

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

4
ответ дан 24 November 2019 в 14:42
поделиться

Упаковка означает преобразование переменной типа значения (т. Е. Целого числа) в ссылочный тип. Распаковка - это противоположность этому, используя приведение типов. В мире .NET все вкратце происходит от типа «объект».

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

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

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

3
ответ дан 24 November 2019 в 14:42
поделиться

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

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

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

  1. Упаковка ( box инструкция IL) и распаковка ( unbox инструкция IL)
  2. Приведение через иерархию наследования (например, dynamic_cast в C ++ , использует castclass инструкцию IL для проверки)
  3. Приведение между примитивными типами (например, static_cast в C ++, существует множество инструкций IL для различных типов приведения типов между примитивными типами )
  4. Вызов определенных пользователем операторов преобразования (на уровне IL они просто вызовы метода соответствующего метода op_XXX ).
27
ответ дан 24 November 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: