Упаковка и распаковка — это наиболее удобный способ преобразования структурного типа в ссылочный, и наоборот. Основное назначение структур — возможность получения некоторых преимуществ объектной ориентации, но при более высокой производительности за счет размещения в стеке. Чтобы преобразовать структуру в ссылку на объект, необходимо упаковать ее экземпляр:
// Создаем и упаковываем нового сотрудника
Employee stan = new Employee (EmpType.Grunt, "Stan", 10);
object stanlnBox = stan;
Поскольку stanlnBox относится к ссылочным типам данных, но при этом сохраняет внутренние значения исходного типа данных Employee, вы можете использовать stan во всех случаях, когда вам нужен объект, и при необходимости производить распаковку.
// Поскольку мы ранее произвели упаковку данных, мы можем распаковать их и производить операции с содержимым
public void UnboxThisEmployee(object о){
// Производим распаковку в структуру Employee для получения доступа ко всем полям
Employee temp = (Employee)o;
Console.WriteLine(temp.name + "is alive!");
}
Вызов этого метода может выглядеть следующим образом:
// Передаем упакованного сотрудника на обработку
t.UnboxThisEmployee(stanlnBox);
Вспомним, что компилятор С# при необходимости автоматически производит упаковку. Поэтому вполне допускается передать объект stan (относящийся кEmployee) методу UnboxThisEmployee() напрямую:
// Stan будет упакован автоматически
t.UnboxThisEmployee(stan);
Однако, поскольку вы определили метод UnboxThisEmployee() таким образом, он обязан принимать объект в качестве параметра, вам придется распаковать ссылку для получения доступа к полям структуры Employee.
К этому моменту мы уже создали множество небольших тестовых программ, которые работают с существующими пространствами имен во вселенной .NET. При построении реальных приложений часто бывает очень полезным сгруппировать ваши типы данных в специально созданные для этой цели пространства имен, эта операция производится при помощи ключевого слова namespace.
Предположим, что мы создаем набор геометрических классов. Один класс получит название Square (квадрат), второй — Circle (окружность), а третий — Не (шестиугольник). Поскольку все эти классы относятся к геометрическим фигурам, мы принимаем решение сгруппировать их в общем пользовательском странстве имен. Основных вариантов в нашем распоряжении два. Согласно которому, мы можем определить все классы в одном файле (shapeslib.es):