Операции упаковать и распаковать (boxing и unboxing). Примеры
В нашем следующем примере демонстрируется применение обеих операций – упаковки и распаковки. Поскольку формальный аргумент процедуры Back принадлежит классу object, то при передаче фактического аргумента значимого типа происходит упаковка значения в объект. Этот объект и возвращается процедурой. Его динамический тип определяется тем объектом памяти, на который указывает ссылка. Когда возвращаемый результат присваивается переменной значимого типа, то, несмотря на совпадение типа переменной с динамическим типом объекта, необходимо выполнить распаковку, содрать объектную упаковку и вернуть непосредственное значение. Вот как выглядит процедура Back и тестирующая ее процедура BackTest из класса Testing:
/// <summary>
/// Возвращает переданный ему аргумент.
/// Фактический аргумент может иметь произвольный тип.
/// Возвращается всегда объект класса object.
/// Клиент, вызывающий метод, должен при необходимости задать
/// явное преобразование получаемого результата
/// </summary>
/// <param name="any"> Допустим любой аргумент</param>
/// <returns></returns>
object Back(object any)
{
return(any);
}
/// <summary>
/// Неявное преобразование аргумента в тип object
/// Явное приведение типа результата.
/// </summary>
public void BackTest()
{
ux = (uint)Back(ux);
WhoIsWho("ux",ux);
s1 = (string)Back(s);
WhoIsWho("s1",s1);
x =(int)(uint)Back(ux);
WhoIsWho("x",x);
y = (float)(double)Back(11 + 5.55 + 5.5f);
WhoIsWho("y",y);
}
Обратите внимание, если значимый тип в левой части оператора присваивания не совпадает с динамическим типом объекта, то могут потребоваться две операции приведения. Вначале нужно распаковать значение, а затем привести его к нужному типу, что и происходит в двух последних операторах присваивания. Приведу результаты вывода на консоль, полученные при вызове процедуры BackTest в процедуре Main:
Рис. 3.2. Вывод на печать результатов теста BackTest
Две двойственные операции «упаковать» и «распаковать» позволяют в зависимости от контекста рассматривать значимые типы как ссылочные, переменные как объекты, и наоборот.
Задания.
Назначение задач этого раздела состоит в знакомстве с основными скалярными встроенными типами, их классификацией, диапазоном возможных значений. Решение задач требует умения объявлять, вводить и выводить значения переменных этих типов.
-
Построить циклическое консольное приложение «Целочисленные типы». Приложение поочередно вводит с консоли значения целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong. Вводу значения предшествует приглашение к вводу. После завершения ввода приложения выводит все введенные значения с указанием их типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
Построить Windows-приложение «Целочисленные типы» с 16-ю помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong в первые 8 окон. По нажатию командной кнопки «Ввод значений» данные из текстовых окно становятся значениями переменных соответствующих типов. По нажатию командной кнопки «Вывод значений» значения переменных соответствующих типов передаются в текстовые окна, предназначенные для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
Построить циклическое консольное приложение «Вещественные типы». Приложение поочередно вводит с консоли значения вещественных типов: float, double. Вводу значения предшествует приглашение к вводу. После завершения ввода приложения выводит все введенные значения с указанием их типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
4.Построить Windows-приложение «Вещественные типы» с 4-мя помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения вещественных типов: float, double в первые 2 окна. По нажатию командной кнопки «Ввод значений» данные из текстовых окно становятся значениями переменных соответствующих типов. По нажатию командной кнопки «Вывод значений» значения переменных соответствующих типов передаются в текстовые окна, предназначенные для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
Построить циклическое консольное приложение «Decimal тип». Приложение поочередно вводит с консоли значения типа Decimal c целой и дробной частью. Вводу значения предшествует приглашение к вводу. После завершения ввода приложение выводит введенное значение с указанием типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
Построить Windows-приложение «Decimal тип» с 2-мя помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения типа Decimal c целой и дробной частью в текстовое окно. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной соответствующего типа. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.
-
Построить циклическое консольное приложение «Строковый тип». Приложение поочередно вводит с консоли символы и строки – значения типов char и string. Вводу значения предшествует приглашение к вводу. После завершения ввода приложение выводит введенное значение с указанием типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу.
-
Построить Windows-приложение «Строковый тип». Пользователь вводит значения в текстовое окно. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной соответствующего типа. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу.
-
Построить циклическое консольное меню-приложение «Выбор». Приложение выводит на консоль нумерованные пункты меню, предлагая затем пользователю задать номер выбранного им пункта меню. При вводе пользователем соответствующего номера начинает выполняться выбранный пункт меню. В данной задаче команды меню определяют тип значений, вводимых и выводимых на консоль (смотри задачи 1.10 – 1.18).
-
Построить Windows-приложение «Выбор». В одно из текстовых окон пользователь вводит тип переменной, в другое – значение. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной, тип которой задан в первом текстовом окне. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений.