ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Такой подход здесь и в других примерах используется только для того, чтобы сосредоточиться на иллюстрации решения соответствующей задачи. Более естественным подходом была бы факторизация типа HelloClass с разделением его на два отдельных класса: HelloClass и HelloApp. При компоновке C#-приложения обычно один тип используется в качестве "объекта приложения" (это тип, определяющий метод Main), в то время как остальные типы
В терминах ООП это называется разграничение обязанностей. В сущности, этот принцип проектирования программ требует, чтобы класс отвечал за наименьший объем работы. Поэтому мы можем изменить нашу программу следующим образом (обратите внимание на то, что здесь в класс HelloClass добавляется новый член PrintMessage).
Исходный код. Проект HelloClass размещен в подкаталоге, соответствующем главе 3.
Класс System.Console
Многие примеры приложений, созданные для первых глав этой книги, используют класс System.Console. Конечно, интерфейс CUI (Console User Interface – консольный интерфейс пользователя) не так "соблазнителен", как интерфейс Windows или WebUI, но, ограничившись в первых примерах интерфейсом CUI, мы можем сосредоточиться на иллюстрируемых базовых понятиях, не отвлекаясь на сложности построения GUI (Graphical User Interface – графический интерфейс пользователя).
Как следует из его имени, класс Console инкапсулирует элементы обработки потоков ввода, вывода и сообщений об ошибках для консольных приложений. С выходом .NET 2.0 тип Console получил новые функциональные возможности.
В табл. 3.2 представлен список некоторых наиболее интересных из них (но, конечно же, не всех).
Таблица 3.2. Подборка членов System.Console, новых для .NET 2.0
Член | Описание |
---|---|
BackgroundColor ForegroundColor | Свойства, устанавливающие цвет изображения/фона для текущего потока вывода. Могут получать значения из перечня ConsoleColor |
BufferHeight BufferWidth | Свойства, контролирующие высоту/ширину буферной области консоли |
Clear | Метод, выполняющий очистку буфера и области отображения консоли |
Title | Свойство, устанавливающее заголовок текущей консоли |
WindowHeight WindowWidth WindowTop WindowLeft | Свойства,
|
Ввод и вывод в классе Console
Вдобавок к членам, указанным в табл. 3.2, тип Console определяет множество методов, обрабатывающих ввод и вывод, причем все эти методы определены как статические (static), поэтому они вызываются на уровне класса. Вы уже видели, что WriteLine вставляет текстовую строку (включая символ возврата каретки) в выходной поток. Метод Write вставляет текст в выходной поток без возврата каретки. Метод ReadLine позволяет получить информацию из входного потока до символа возврата каретки, a Read используется дли захвата одного символа из входного потока.
Чтобы проиллюстрировать основные возможности ввода-вывода класса Console, рассмотрим следующий метод Main, который запрашивает у пользователя некоторую информацию и повторяет каждый элемент в потоке стандартного вывода. На рис 3.5 показан пример выполнения такой программы.
Рис. 3.5. Ввод и вывод с помощью System.Console
Форматирование консольного вывода
В этих первых главах вы много раз видели в строковых литералах символы {0}, {1} и др. В .NET вводится новый стиль форматирования строк, немного напоминающий стиль функции printf в C, но без загадочных флагов %d, %s и %с. Вот простой пример (соответствующий вывод показан на рис. 3.6).
Рис. 3.6. Множество "пустышек" в строковых литералах
Первый параметр метода WriteLine представляет собой строковый литерал, который содержит опции-заполнители, обозначенные {0}, {1}, {2} и т.д. (нумерация в фигурных скобках всегда начинается с нуля). Остальные параметры WriteLine являются значениями, которые должны быть вставлены на место соответствующих заполнителей (в данном случае это theInt, theDouble и theBool).
Также следует знать о том, что метод WriteLine перегружен, чтобы можно было указывать в качестве значения заполнителя массив объектов. Так, строкой формата следующего вида можно представить любое число элементов.