Сайт для программистов

воскресенье, 31 августа 2008 г.

О перечислении Enum, стилях для HatchBrush и документации на MSDN

В своей книге C#. Советы программистам я привел несколько примеров для работы с перечислением Enum. Недавно для одного проекта мне понадобилось воспользоваться одним из описанных способов для перечисления всех стилей для кисти HatchBrush. Я написал следующее:

foreach (HatchStyle hatch_style in Enum.GetValues(typeof(HatchStyle)))
{
listBox1.Items.Add(hatch_style.ToString());
}

Когда я посмотрел на список, то увидел, что некоторые элементы списка повторяются. Например, стиль Horizontal повторяется два раза, а стиль LargeGrid - три раза. Сначала я подумал, что совершил ошибку в коде. Не найдя ошибки в этом примере, я решил прогуляться на сайт MSDN и посмотреть, что пишут про перечисление HatchStyle. Просматривая все значения стилей, я заметил, что стилю Min соответствует стиль Horizontal. Стало понятно, откуда взялось в моем списке два одинаковых стиля Horizontal. Обрадовшись, стал искать соответствия для трех значений LargeGrid. И тут я столкнулся с проблемой. В документации говорилось, что этому стилю соответствует сам LargeGrid и стиль Cross. А как же быть с третьим вариантом? Больше нигде не упоминалось о связи стилей с значением LargeGrid. Тут меня осенило. Взглянув еще раз на примеры из книги, я решил написать дополнительно еще несколько строчек кода, которые выводят имена стилей HatchBrush при помощи Enum.GetNames:

string[] hatchstyles = Enum.GetNames(typeof(HatchStyle));
foreach (string s in hatchstyles)
{
listBox2.Items.Add(s);
}

Расположив два списка рядом, сразу стало видно, что чему соответствует. Как уже говорилось выше, значению Horizontal соответствовали стили Horizontal и Min, а значению LargeGrid соответствовали стили Cross, LargeGrid, Max. Обратившись снова к документации, обнаружил, что стилю Max соответствует значение SolidDiamond. Удивившись, я решил просто вывести на форме три прямоугольника с разными стилями:

private void Form1_Paint(object sender, PaintEventArgs e)
{
HatchBrush hatchbrush = new HatchBrush(HatchStyle.Max, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 20, 300, 100);

hatchbrush = new HatchBrush(HatchStyle.LargeGrid, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 130, 300, 100);

hatchbrush = new HatchBrush(HatchStyle.SolidDiamond, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 240, 300, 100);
}

Запустив пример, я убедился, что мой код для списков выдает правильные результаты. Если вы посмотрите на форму, то увидите, что первые два прямоугольника закрашены одинаковыми узорами (Max и LargeGrid), а третий прямоугольник закрашен совсем по другому. Таким образом, получается, что в документацию MSDN вкралась ошибка. Поэтому, когда вы обращаетесь к документации, старайтесь перепроверять написанное. Документацию пишут тоже живые люди, которые могут ошибаться.
А завтра начинается новый учебный год для школьников и студентов. Некоторые из них начнут или продолжат изучение программирования.
Счастливого вам программирования, девочки и мальчики!

Комментариев нет: