Книга: C# для профессионалов. Том II
Size и SizeF
Size и SizeF
Подобно Point
и PointF
размеры выступают в двух вариантах. Структура Size
предназначена для работы с целыми значениями, SizeF
— для значений с плавающей точкой. В остальном Size
и SizeF
идентичны. Мы сосредоточимся здесь на структуре Size
.
Во многом Size
аналогична структуре Point
. Она имеет два целых свойства, которые представляют горизонтальное и вертикальное расстояния, основное различие состоит в том, что вместо X
и Y
эти свойства называются Width
и Height
. Можно представить предыдущую диаграмму с помощью кода:
Size АВ = new Size(20, 10);
Console.WriteLine("Moved {0} across, {1} down", AB.Width, AB.Height);
Строго говоря структура Size
математически представляет то же, что и Point
, но концептуально она предназначена для использования немного другим образом. Point
применяется, если говорится о местоположении объекта, a Size
— когда речь идет о размере чего-то.
В качестве примера рассмотрим нарисованный ранее прямоугольник с координатой вверху слева (0, 0) и размером (50, 50):
Graphics dc. = е.Graphics;
Pen BluePen = new Pen(Color.Blue, 3);
dc.Rectangle(BluePen, 0, 0, 50, 50);
Размер этого прямоугольника равен (50, 50) и может быть представлен экземпляром Size
. Нижний правый угол также находится в точке (50, 50), но будет представляться экземпляром Point
. Чтобы увидеть различия, предположим, что мы рисуем прямоугольник в другом месте, так что его верхняя левая координата будет (10, 10).
dc.DrawRectangle(BluePen, 10, 10, 50, 50);
Теперь нижний правый угол имеет координаты (60, 60), но размер не изменился — по-прежнему (50, 50).
Дополнительный оператор был перезагружен для точек и размеров так, чтобы можно было добавлять размер к точке задавал другую точку:
static void Main(string [] args) {
Point TopLeft = new Point (10, 10);
Size RectangleSize = new Size(50, 50);
Point BottomRight = TopLeft + RectangleSize;
Console.WriteLine("TopLeft = " + TopLeft);
Console.WriteLine("BottomRight = " + BottomRight);
Console.WriteLine("Size = " + RectangleSize);
}
Этот код, выполняемый как простое консольное приложение, создает следующий вывод:
Отметим, что этот вывод показывает также, как метод ToString()
объектов Point
и Size
был переопределен для вывода значения в формате {X, Y}.
Аналогично можно вычесть Size
из Point
, чтобы задать Point
, или складывать два размера Size
, задавая другой размер Size
. Однако невозможно сложить точку Point
с другой точкой Point
. Компания Microsoft определила, что такое действие не имеет концептуального смысла, поэтому было решено не создавать никакою перезагружаемого оператора + который бы позволял это сделать.
Можно также явно преобразовать Point
в Size
и наоборот:
Point TopLeft = new Point(10, 10);
Size S1 = (Size)TopLeft;
Point P1 = (Point)S1;
При этом преобразовании значению S1.Width
присваивается значение TopLeft.X
, а S1.Height
— TopLeft.Y
. Следовательно, S1
содержит (10, 10). P1
будет содержать те же значения, что и TopLeft
.
- Page size
- LOCK_MEM_SIZE
- EVENT MEMORY SIZE
- DATABASE CACHE SIZE
- SERVER WORKING SIZE
- Texture Size
- Ключевое слово sizeof
- 13.3 Fixed-Size Memory Management in Embedded Systems
- 10.1.4 Stack guard size
- 14.4.6.1. Небольшой учебный пример по Python: imgsizer
- A7.4.8. Оператор определения размера sizeof
- 4.6.4 Limits on Window Size