Нет, это решение абсолютно правильное и очень минимальное.
Отметьте, однако, что это очень необычная ситуация: поскольку String
обрабатывается специально в Java, даже "foo"
на самом деле является String
. Таким образом, в обычном коде нет необходимости разбивать строку на отдельные char
и объединять их обратно.
Сравните это с C / C ++, где "foo"
у вас есть пакет char
, оканчивающийся нулевым байтом на одной стороне и string
на другой стороне, и многие преобразования между ними обусловлены унаследованными методами.
Упаковка относится к преобразованию типа значения, не допускающего значения 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
явно преобразует выражение
в объект типа типа
.
Упаковка и распаковка - это подмножество приведений типов. Упаковка - это процесс обработки типа значения как ссылочного типа (что на практике включает в себя копирование содержимого этого типа значения (из стека) в кучу и возврат ссылки на этот объект). Это позволяет передавать тип значения везде, где ожидается совместимый ссылочный тип. Он также позволяет выполнять вызовы виртуальных методов и другие функции ссылочных типов для типа значения. Распаковка - это обратная операция по отношению к этой операции (получение обратно типа значения из упакованного объекта).
Приведение типа - это термин, используемый для любого типа преобразования из переменной одного типа в другую. Это более широкое понятие.
Несколько минут назад я ответил на связанный вопрос, который охватывает это различие . Подвести итоги, Выполнение этой операции упаковки выделяет память в куче (которую сборщик мусора в конечном итоге должен будет освободить). Распаковка - это процесс, обратный этому процессу, когда ссылочный тип превращается в тип значения.
Приведение принимает тип (скажем, System.Object) и обрабатывает его как другой тип (скажем, System.String).
1294] Когда вы упаковываете что-то в C #, вы преобразуете это в другой тип. Разница в том, что он выделяет дополнительную память по мере создания нового ссылочного типа .
Итог: бокс - это особый вид преобразования, который преобразует тип значения в ссылочный тип, что требует выделения новый ссылочный тип.
взятие ссылочного типа и превращение его в тип значения.Приведение принимает тип (скажем, System.Object) и обрабатывает его как другой тип (скажем, System.String).
Когда вы помещаете что-то в C # , вы переходите к другому типу. Разница в том, что он выделяет дополнительную память по мере создания нового ссылочного типа .
Итог: бокс - это особый вид преобразования, который преобразует тип значения в ссылочный тип, что требует выделения новый ссылочный тип.
взятие ссылочного типа и превращение его в тип значения.Приведение принимает тип (скажем, System.Object) и обрабатывает его как другой тип (скажем, System.String).
Когда вы помещаете что-то в C # , вы переходите к другому типу. Разница в том, что он выделяет дополнительную память по мере создания нового ссылочного типа .
Итог: бокс - это особый вид преобразования, который преобразует тип значения в ссылочный тип, что требует выделения новый ссылочный тип.
Упаковка / распаковка и приведение типов - это две разные операции, однако они используют один и тот же синтаксис.
Они взаимозаменяемы только тогда, когда человек, говорящий об этом, не знает, что на самом деле происходит. ..
Упаковка - это сохранение типа значения как объекта в куче, а при распаковке - считывание значения из объекта. Вы можете распаковать значение только потому, что это точный тип.
Приведение - это когда вы конвертируете базовый тип в другой базовый тип (например, из int
в long
) или когда вы меняете тип ссылки (например, с List
на IEnumerable
).
Упаковка означает преобразование переменной типа значения (т. Е. Целого числа) в ссылочный тип. Распаковка - это противоположность этому, используя приведение типов. В мире .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
Выводом из этого является унификация системы типов, позволяющая обрабатывать типы-значения как ссылочные типы. В этой статье более подробно рассматривается упаковка / распаковка.
Упаковка и распаковка - это подмножество приведений типов. Упаковка - это процесс обработки типа значения как ссылочного типа (что на практике включает копирование содержимого этого типа значения (из стека) в кучу и возврат ссылки на этот объект). Это позволяет передавать тип значения везде, где ожидается совместимый ссылочный тип. Он также позволяет выполнять вызовы виртуальных методов и другие функции ссылочных типов для типа значения. Распаковка - это операция, обратная этой операции (получение обратно типа значения из упакованного объекта).
Приведение типа - это термин, используемый для любого типа преобразования из переменной определенного типа в другую. Это более широкое понятие.
Несколько минут назад я ответил на связанный с этим вопрос, который охватывает это различие . Подводя итог, я классифицировал различные типы инструкций IL, генерируемых оператором приведения C #:
box
инструкция IL) и распаковка ( unbox
инструкция IL) dynamic_cast
в C ++ , использует castclass
инструкцию IL для проверки) static_cast
в C ++, существует множество инструкций IL для различных типов приведения типов между примитивными типами ) op_XXX
).