Страница 394 из 502
<b>Время выполнения: 0:00:00.014</b>
<b>Время выполнения: 0:00:00:00.0140000</b>
<b>Время выполнения: 0.014 секунды</b>
Форматирование перечислений
В C# допускается также форматировать значения, определяемые в перечислении. Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению. Спецификаторы формата перечислений сведены в табл. ”22.10. Обратите особое внимание на форматы G и F. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут Flags. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные по степени числа 2. При наличии атрибута Flags имена всех битовых составляющих форматируемого значения, если, конечно, это действительное значение, отображаются с помощью спецификатора G. А с помощью спецификатора F отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении.
Таблица 22.10. Спецификаторы формата перечислений
Спецификатор
Назначение
D
Отображает значение в виде десятичного целого числа
d
То же, что и D
F
Отображает имя значения. Если это значение можно создать путем логического сложения по ИДИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо оттого, задан атрибут Flags или нет
f
То же, что и F
G
Отображает имя значения. Если перед форматируемым перечислением указывается атрибут Flags, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значение
g
То же, что и G
X
Отображает значение в виде шестнадцатеричного целого числа. Для отображения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями
х
То же, что и X
В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений.
<b>// Отформатировать перечисление.</b>
<b>using System;</b>
<b>class EnumFmtDemo {</b>
<b> enum Direction { North, South, East, West }</b>
<b> [Flags]</b>
<b> enum Status {</b>
<b> Ready = 0x1, OffLine = 0x2,</b>
<b> Waiting = 0x4, TransmitOK = 0x8,</b>
<b> ReceiveOK = 0x10, OnLine = 0x20</b>
<b> }</b>
<b> static void Main() {</b>
<b> Direction d = Direction.West;</b>
<b> Console.WriteLine("{0:G}", d);</b>
<b> Console.WriteLine("{0:F}", d);</b>
<b> Console.WriteLine("{0:D}", d);</b>
<b> Console.WriteLine("{0:X}", d);</b>
<b> Status s = Status.Ready | Status.TransmitOK;</b>
<b> Console.WriteLine("{0:G}", s);</b>
<b> Console.WriteLine("{0:F}", s);</b>
<b> Console.WriteLine("{0:D}", s);</b>
<b> Console.WriteLine("{0:X}", s);</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения этой программы.
<b>West</b>
<b>West</b>
<b>3</b>
<b>00000003</b>
<b>Ready, TransmitOK</b>
<b>Ready, TransmitOK</b>
<b>9</b>
<b>00000009</b>
ГЛАВА 23 Многопоточное программирование. Часть первая: основы
Среди многих замечательных свойств языка C# особое место принадлежит поддержке многопоточного программирования. Многопоточная программа состоит из двух или более частей, выполняемых параллельно. Каждая часть такой программы называется потоком и определяет отдельный путь выполнения команд. Таким образом, многопоточная обработка является особой формой многозадачности.
Многопоточное программирование опирается на целый ряд средств, предусмотренных для этой цели в самом языке С#, а также на классы, определенные в среде .NET Framework. Благодаря встроенной в C# поддержке многопоточной обработки сводятся к минимуму или вообще устраняются многие трудности, связанные с организацией многопоточной обработки в других языках программирования. Как станет ясно из дальнейшего, поддержка в C# многопоточной обработки четко организована и проста для понимания.
С выпуском версии 4.0 в среде .NET Framework появились два важных дополнения, имеющих отношение к многопоточным приложениям. Первым из них является TPL (Task Parallel Library — Библиотека распараллеливания задач), а вторым — PLINQ (Parallel LINQ — Параллельный язык интегрированных запросов). Оба дополнения поддерживают параллельное программирование и позволяют использовать преимущества, предоставляемые многопроцессорными (многоядерными) компьютерами в отношении обработки данных. Кроме того, библиотека TPL упрощает создание многопоточных приложений и управление ими. В силу этого многопоточная обработка, опирающаяся на TPL, рекомендуется теперь как основной подход к разработке многопоточных приложений. Тем не менее накопленный опыт создания исходной многопоточной подсистемы по-прежнему имеет значение по целому ряду причин. Во-первых, уже существует немалый объем унаследованного кода, в котором применяется первоначальный подход к многопоточной обработке. Если приходится работать с таким кодом или сопровождать его, то нужно знать, как работает исходная многопоточная система. Во-вторых, в коде, опирающемся на TPL, могут по-прежнему использоваться элементы исходной многопоточной системы, и особенно ее средства синхронизации. И в-третьих, несмотря на то что сама библиотека TPL основывается на абстракции, называемой задачей, она по-прежнему неявно опирается на потоки и потоковые средства, описываемые в этой главе. Поэтому для полного усвоения и применения TPL потребуются твердые знания материала, излагаемого в этой главе.