Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974