|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 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.
Распаковка аргумента метода вручную

