Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л.Р. №2 Система типов языка С.doc
Скачиваний:
9
Добавлен:
31.05.2015
Размер:
146.43 Кб
Скачать

Операции упаковать и распаковать (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

Две двойственные операции «упаковать» и «распаковать» позволяют в зависимости от контекста рассматривать значимые типы как ссылочные, переменные как объекты, и наоборот.

Задания.

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

  1. Построить циклическое консольное приложение «Целочисленные типы». Приложение поочередно вводит с консоли значения целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong. Вводу значения предшествует приглашение к вводу. После завершения ввода приложения выводит все введенные значения с указанием их типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  2. Построить Windows-приложение «Целочисленные типы» с 16-ю помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong в первые 8 окон. По нажатию командной кнопки «Ввод значений» данные из текстовых окно становятся значениями переменных соответствующих типов. По нажатию командной кнопки «Вывод значений» значения переменных соответствующих типов передаются в текстовые окна, предназначенные для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  3. Построить циклическое консольное приложение «Вещественные типы». Приложение поочередно вводит с консоли значения вещественных типов: float, double. Вводу значения предшествует приглашение к вводу. После завершения ввода приложения выводит все введенные значения с указанием их типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  4. 4.Построить Windows-приложение «Вещественные типы» с 4-мя помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения вещественных типов: float, double в первые 2 окна. По нажатию командной кнопки «Ввод значений» данные из текстовых окно становятся значениями переменных соответствующих типов. По нажатию командной кнопки «Вывод значений» значения переменных соответствующих типов передаются в текстовые окна, предназначенные для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  5. Построить циклическое консольное приложение «Decimal тип». Приложение поочередно вводит с консоли значения типа Decimal c целой и дробной частью. Вводу значения предшествует приглашение к вводу. После завершения ввода приложение выводит введенное значение с указанием типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  6. Построить Windows-приложение «Decimal тип» с 2-мя помеченными текстовыми окнами и двумя командными кнопками Пользователь вводит значения типа Decimal c целой и дробной частью в текстовое окно. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной соответствующего типа. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы интервала возможных значений типа.

  7. Построить циклическое консольное приложение «Строковый тип». Приложение поочередно вводит с консоли символы и строки – значения типов char и string. Вводу значения предшествует приглашение к вводу. После завершения ввода приложение выводит введенное значение с указанием типа. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу.

  8. Построить Windows-приложение «Строковый тип». Пользователь вводит значения в текстовое окно. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной соответствующего типа. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений. Проанализировать, что происходит при вводе значений, не соответствующих требуемому типу.

  9. Построить циклическое консольное меню-приложение «Выбор». Приложение выводит на консоль нумерованные пункты меню, предлагая затем пользователю задать номер выбранного им пункта меню. При вводе пользователем соответствующего номера начинает выполняться выбранный пункт меню. В данной задаче команды меню определяют тип значений, вводимых и выводимых на консоль (смотри задачи 1.10 – 1.18).

  10. Построить Windows-приложение «Выбор». В одно из текстовых окон пользователь вводит тип переменной, в другое – значение. По нажатию командной кнопки «Ввод значений» данные из текстового окна становятся значением переменной, тип которой задан в первом текстовом окне. По нажатию командной кнопки «Вывод значений» значение переменной передается в текстовое окно, предназначенное для вывода значений.