Вбудовані структури
Як вже зазначалося, всі значущі типи мови реалізовані структурами. У бібліотеці FCL є і інші вбудовані структури. Розглянемо як приклад структури Point, POINTF, Size, SIZEF, Rectangle, що знаходяться в просторі імен System.Drawing (при роботі з консольним проектом цей простір потрібно підключати рис 2.1). Дані структури активно використовуються при роботі з графічними об'єктами. Структури Point, POINTF визначають точки на площині. Властивості X і Y дозволяють задавати координати точки, цілочисельні або дійсні. Для структур Size і SIZEF властивості Height і Width задають висоту і ширину. Структури Point і Size дозволяють сформувати прямокутну область – структуру Rectangle. Конструктору прямокутника можна передати як аргументи дві структури: точку, що задає координати лівого верхнього кута прямокутника, і розмір – висоту і ширину прямокутника.
Рисунок 2.1 – Підключення простору імен System.Drawing
Між чотирма структурами визначені взаємні перетворення: точки можна перетворити в розміри і навпаки, складання і віднімання визначене над точками і розмірами, але не над точками, дійсний тип яких різними способами можна привести до цілого. Ряд операцій над цими структурами продемонстрований в наступному прикладі:
public void TestPointAndSize()
{
Point pt1 = new Point(3, 5), pt2 = new Point(7, 10), pt3;
POINTF pt4 = new POINTF(4.55f, 6.75f);
Size sz1 = new Size(10, 20), sz2;
SIZEF sz3 = new SIZEF(10.3f, 20.7f);
pt3 = Point.Round(pt4);
sz2 = new Size(pt1);
Console.WriteLine("pt1: " + pt1);
Console.WriteLine("sz2 = new Size(pt1): " + sz2);
Console.WriteLine("pt4: " + pt4);
Console.WriteLine("pt3 = Point.Round(pt4): " + pt3);
pt1.Offset(5, 7);
Console.WriteLine("pt1.Offset(5,7): " + pt1);
Console.WriteLine("pt2: " + pt2);
pt2 = pt2 + sz2;
Console.WriteLine("pt2= pt2+ sz2: " + pt2);
}//TestPointAndSize
Результати його виконання показані на рис. 2.2.
Рисунок 2.2 – Операції над точками і розмірами
Відзначимо, що метод ToString, визначений для цих структур, видає рядок із значеннями полів в прийнятній для сприйняття формі.
Ще раз про дві семантики привласнення
На закінчення розмови про посилальні і розгорнені типи побудуємо клас CPoint, що є аналогом структури Point. Не приводитимо опис цього класу, сподіваймося, він є достатньо зрозумілим. Обмежимося прикладом, в якому аналогічні дії виконуються над об'єктами, що належать структурі Point і класу CPoint:
public void TestClassAndStructPoint()
{
string s = "Структури: привласнення розгорненого типу!";
Console.WriteLine(s);
Point pt1 = new Point(3, 5), pt2;
pt2 = pt1;
Console.WriteLine("pt1: " + pt1);
Console.WriteLine("pt2 = pt1: " + pt2);
pt1.Offset(5, 7);
Console.WriteLine("pt1.Offset(5,7): " + pt1);
Console.WriteLine("pt2: " + pt2);
s = "Класи: привласнення посилального типу!";
Console.WriteLine(s);
CPoint cpt1 = new CPoint(3, 5), cpt2;
cpt2 = cpt1;
Console.WriteLine("cpt1: " + cpt1);
Console.WriteLine("cpt2=cpt1: " + cpt2);
cpt1.Offset(5, 7);
Console.WriteLine("cpt1.Offset(5,7): " + cpt1);
Console.WriteLine("cpt2: " + cpt2);
}
Результати обчислень показані на рис. 2.3.
Рисунок 2.3 – Дві семантики привласнення
Дії над об'єктами Point і CPoint виконуються аналогічні, а результати виходять різні: в кінці обчислень pt1 і pt2 різні, а cpt1 і cpt2 співпадають. Пояснення цьому зрозуміло: у першому випадку привласнення структур pt2 і pt1 – значуще, а для об'єктів cpt1 і cpt2 – посилальне.
