КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Упаковка–преобразованиеУпаковка используется для хранения типов значений в куче "сбора мусора". Упаковка представляет собой неявное преобразование типа значения в тип object или любой другой тип интерфейса, реализуемый этим типом значения. При упаковке типа значения в куче выделяется экземпляр объекта и выполняется копирование значения в этот новый объект. Рассмотрим следующее объявление переменной типа значения. int i = 123; Следующий оператор неявно применяет операцию упаковки к переменной i. object o = i; // Implicit boxing Результат этого оператора создает ссылку на объект o в стеке, которая ссылается на значение типа int в куче. Это значение является копией значения типа значения, назначенного переменной i. Разница между двумя этими переменными, i и o, продемонстрирована на рисунке ниже. Упаковка-преобразование: Можно также выполнять упаковку явным способом, как в следующем примере, однако явная упаковка не является обязательной. int i = 123; object o = (object)i; // explicit boxing
Этот пример преобразует целочисленную переменную i в объект o при помощи упаковки. Затем значение, хранимое переменной i, меняется с 123 на 456. В примере показано, что исходный тип значения и упакованный объект используют отдельные ячейки памяти, а значит, могут хранить разные значения. class TestBoxing { static void Main() { int i = 123; object o = i; // Implicit boxing
i = 456; // Change the contents of i
System.Console.WriteLine("The value-type value = {0}", i); System.Console.WriteLine("The object-type value = {0}", o); } } /* Output: The value-type value = 456 The object-type value = 123 */
В следующем примере показан случай недопустимого процесса распаковки, в результате которого вызывается InvalidCastException. При использовании try и catch, когда возникает ошибка, выводится сообщение об ошибке.
class TestUnboxing { static void Main() { int i = 123; object o = i; // implicit boxing
try { int j = (short)o; // attempt to unbox
System.Console.WriteLine("Unboxing OK."); } catch (System.InvalidCastException e) { System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message); } } }
При выполнении этой программы выводится следующий результат:
Specified cast is not valid. Error: Incorrect unboxing.
При изменении оператора int j = (short) o; на: int j = (int) o; будет выполнено преобразование со следующим результатом: Unboxing OK.
|