Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1446 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 4:

Типы данных C#

Автоматическая упаковка аргумента метода

Процесс упаковки выполняется автоматически при передачи объекта методу в случае, если метод ожидает упакованный объект, а ему в качестве аргумента передается распакованный объект.

using System;
    
namespace Test
{
    // Значимый тип, данные размещаются в стеке
    struct Point    
    {
        // Закрытые поля
        int x, y;
    
        // Конструктор
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        // Функция доступа
        public void Set(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        // Печать
        public void Show(string message)
        {
            Console.WriteLine(message + "x={0}, y={1}", x, y);
        }
    }
    
    // Класс с функцией Main может иметь экземпляр
    // Необязательно все функции в этом классе должны быть статическими
    class EntryPoint
    {
    static void Main()
    {
    // Настройка консоли
    Console.Title = "Автоматическая упаковка аргумента метода";
    Console.ForegroundColor = ConsoleColor.White;
    Console.CursorVisible = false;
    
    Point valPoint = new Point(5, 10);// Инициализировали и поместили в стек
    valPoint.Show("Распакованный объект вне метода: ");
    Program prg = new Program();//!!!!!
    prg.AutoPackPoint(valPoint);// Создали еще один объект в куче
    valPoint.Show("Распакованный объект вне метода: ");
        
    Console.ReadLine();// Для задержки окна
    }
    
    // Метод ожидает упакованный объект, поэтому
    // автоматически упаковывает распакованный аргумент
    void AutoPackPoint(object arg)
    {
    // Проверим тип для подстраховки, чтобы не вызвать исключение
    if (arg is Point)
    {
    Point point = (Point)arg;// Распаковываем
    point.Set(20, 30);// Изменяем
    point.Show("Распакованный объект внутри метода: "); // Печатаем
    }
    else
    Console.WriteLine("Вы прислали не Point!");
    }
    }
}
Листинг 4.6. Пример автоматической упаковки аргумента при передаче методу

Ручная распаковка аргумента метода

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

using System;
    
namespace Test
{
    // Класс с функцией Main не может иметь экземпляр
    // Поэтому все функции в этом классе должны быть статическими
    class EntryPoint
    {
    static void Main()
    {
    // Настройка консоли
    Console.Title = "Распаковка аргумента метода вручную";
    Console.ForegroundColor = ConsoleColor.White;
    Console.CursorVisible = false;
    
    Point valPoint = new Point(5, 10);// Инициализировали и поместили в стек
    valPoint.Show("Распакованный объект вне метода: ");
    object refPoint = valPoint;// Упаковали значимый объект
    ManualUnPackPoint((Point)refPoint);// Распаковываем вручную
        
    Console.ReadLine();// Для задержки окна
    }
    
    // Метод ожидает распакованный объект, распаковка 
    // должна выполняться вручную для контроля типов
    static void ManualUnPackPoint(Point arg)
    {
    arg.Set(20, 30);// Изменяем распакованную копию
    arg.Show("Копия объекта внутри метода: "); // Печатаем
    }
    }
}
    
namespace Test
{
    // Значимый тип, данные размещаются в стеке
    struct Point
    {
        // Закрытые поля
        int x, y;
    
        // Конструктор
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        // Функция доступа
        public void Set(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        // Печать
        public void Show(string message)
        {
            Console.WriteLine(message + "x={0}, y={1}", x, y);
        }
    }
}
Листинг 4.7. Распаковка аргумента метода вручную

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?