Text
                    Программирование в тональности I
Чарльз Петцольд
•* «
И РУССКАЯ РЕДАКЦИЯ
Microsoft Press
Programming in the key of
Charles Petzold
Microsoft' Press

Программирование в тональности
Чарльз Петцольд
Москва 2004
«.РУССКАЯ РЕДАКШ
УДК 004.45 ББК 32.973.26-018.2
П31
Петцольд Ч.
П31
Программирование в тональности С#. - М.: Издательско торговый дом «Русская Редакция», 2004. - 512 с.: ил.
ISBN 5-7502-0180-5
Эта книга—своего рода учебник для тех, кто решил заняться изучением C#—современного, объектно-ориентированного языка программирования, разработанного Microsoft. Этот язык при -надлежит к обширной коллекции программных технологий под общим названием .NET и предназначен для Интернет-програм-мирования и написания приложений, работающих под управлением Microsoft Windows.
Автор шаг за шагом, переходя от простого к сложному, описывает основные элементы С#: операторы, типы, условия и циклы, объекты, и рассказывает о принципах и тонкостях программирования, сопровождая рассказ массой примеров. В каждой главе читателю предлагается небольшая программа, позволяющая на практике опробовать описанные приемы.
Книга написана живым, ироничным и доступным языком, что, безусловно, облегчает восприятие материала. Она состоит из прелтодии,41 главы и приложения. Книга предназначена тем, кто желает изучить азы программирования на объектно-ориентированном языке С#.
УДК 004.45
ББК 32.973.26-018.2
DirectX, Microsoft, Micrusoft Press, MS-DOS, MSDN, Visual Basic, Visual C#, Visual C-*-+, Visual Studio. Windows и Windows Media являются товарными знаками или охраняемыми товарными знаками корпорации Microsoft в США и/нли других странах. Наименования других продуктов или компаний, упоминаемых в этой книге, могут был. гонарными знаками их владельцев.
Примеры компаний, организаций, продуктов, доменных имен, адресов элекг|х)1той почты, логотипов, людей, мест и событий, упоминаемых в этой книге, вымышлены и не имеют никакого отношения к реальным компаниям, организациям, продуктам, доменным именам, адресам электронной почты, логотипам, людям, местам н событиям.
9 Оригинальное издание на английском языке, Charles Pctzold, 2004
© Перевод на русский язык, Microsoft Corporation, 2004
© Оформление и подготовка к изданию, издател деко-торговый дом «Русская Редакции», 2004
uttN 0-7356-1800-3 (ami д.)
ISBN 5-7502-0180-5
ОГЛАВЛЕНИЕ
Прелюдия...............................VII
Часть I НАЧАЛО___________......__________1
1	Вы — программист...............2
2	Первые присваивания...........12
3	Объявления цели...............19
4	Редактирование, компиляция,
запуск.......................28
5	Вывод на консоль............  34
6	Арифметические операции
и их клавиатурные сокращения..41
7	Комментарии...................53
Часть II	ОСНОВНЫЕ ТИПЫ_________________59
8	Целые в .NET Framework........60
9	Строки текста.................77
10	Стек и куча...................88
11	Строковые преобразования......93
12	Консольный ввод..............100
13	Константы....................105
14	Десятичные числа.............110
15	Плавающая точка..............118
16	Модное форматирование........127
17	Методы и поля................135
18	Массивы......................156
19	Булевы выражения.............180
20	Символы и строки.............188
у|	Оглавление
Часть III	УСЛОВИЯ И ЦИКЛЫ...____________491
21	Сравнения.....................200
22	Создание решений..............208
23	Условные операторы............226
24	Цикл While....................231
25	Перехват исключений...........248
26	Циклы For и Foreach...........260
27	Печально известный Goto.......279
28	Switch и Case.................284
29	Биты и перечисления...........290
30	Параметры и аргументы.........306
Часть IV	ОБЪЕКТЫ_______________________319
31	Инкапсулирование данных.......320
32	Методы экземпляров............331
33	Конструкторы..................343
34	Концепции равенства...........355
35	Поля и свойства...............366
36	Н асл едование................380
37	Виртуальность.................392
38	Перегруженный оператор........410
39	Классы и библиотеки...........428
40	Суть Framework................442
41	Кода..........................461
Приложение...............................489
Об авторе................................491
ПРЕЛЮДИЯ
Эта книга для тех, кто желает изучить язык программирования С#. Я всеми силами старался избежать допущений о каком-либо предшествующем опыте программирования, который может быть или которого у вас нет. Книга начинается рассказом о переменных и заканчивается программой, проигрывающей музыку.
C# — современный, объектно-ориентированный язык, разработанный Microsoft. Этот язык принадлежит к значительной коллекции программных технологий под общим названием .NET (произносится «дот нет»), впервые заявленной летом 2000 г. и выпущенной полтора года спустя. C# и .NET можно использовать для Интернет-программи-рования или для написания программ, работающих под Microsoft Windows.
C# — не единственный язык программирования, который годится для программирования в .NET. Microsoft опубликовала «Общую спецификацию языков» (Common Language Specification, CLS), где определила минимальный набор функций, которыми должен обладать язык программирования, применяемый в .NET. Предполагаегся, что многие языки программирования будут адаптированы к требованиям CLS. Но C# разработан непосредственно для .NET и отлично соответствует параметрам .NET.
Как следует из названия, C# — это своего рода потомок языков программирования С и C++, кроме того, он имеет определенное сходство с Java, также возникшим под влиянием С и C++. Все эти языки семейства С (как их теперь называют) имеют похожий синтаксис, но при более близком рассмотрении заметны глубокие различия. В частности, C# относится к языкам программирования, которые несколько жертвуют производительностью ради безопасности. Как вы узнаете из главы 1, С и C++ стали популярными в том числе и благодаря тому, что написанные на них программы работают
VIII
Прелюдия
быстро и требуют м инимального объема памяти. Такая производительность реализуется в предположении, что програм мист — очень шустрый и не делает ошибок; сами языки не предоставляют средств проверки, позволяющих выяснить, не делает ли программа чего-либо запрещенного, например, не обращается ли к области памяти, к которой не должна обращаться. Программы на С и C++ способны работать быстро, но часто содержат ошибки, которые трудно диагностировать.
В наше время машины достаточно быстры, а память — весьма дешева, чтобы производительность программ не становилась основным предметом для беспокойства. О чем мы заботимся гораздо больше, чем о производительности, так это о том, чтобы в программах оказалось как можно меньше ошибок. Несмотря на то, что ни один язык программирования не дает программистам возможности писать полностью свободные от ошибок программы, C# в этом отношении гораздо лучше С и C++. По этой причине программы на C# более безопасны.
Программы на C# более безопасны и в другом отношении. Получая программы через Интернет, пользователи хотят быть уверены, что эти программы не повредят каким-либо образом их компьютеры или данные. C# (как и Java) имеет преимущества и здесь. Традиционно основной инструмент, используемый программистом, — это компилятор, преобразующий исходный код (написанный программистом) в исполняемый файл (запускаемый на компьютере). В противоположность этому компилятор C# преобразует исходный код программы в IL-код (intermediate language, IL), который не может быть непосредственно исполнен на компьютере. До того, как запустить программу, IL-код можно проверить, чтобы определить, способен ли он сделать что-либо опасное. Далее он преобразуется в исполняемый файл. Этот последний этап находится в компетенции общеязыковой исполняющей среды (common language runtime, CLR) .NET.
Когда в 2000 г. я начал работать с С#, он быстро стал моим любимцем. В C# повторяется большая часть лаконичного синтаксиса С, который я с удовольствием использовал с тех пор, как впервые узнал С в 1985 г. Но в C# также добавлены современные, объектно-ориентированные черты, а бесполезная часть наследия С практически не сохранена. C# совмещает старое и новое почти в идеальных пропорциях.
Прелюдия	| у
Вскоре после того, как я начал работать с С#, я также увидел, что он может стать хорошим первым языком программирования для новичков. C# — элегантный и мощный язык, и он часто защищает программиста-новичка от типичных ошибок. Именно поэтому я и решил написать эту книгу.
Я ранее отмечал, что C# годится для написания приложений .NET для работы в Интернете или в среде Windows. Конечно, рассказывая об этом придется описывать и многочисленные возможность интерфейсов, однако данная книга посвящена другому, она — о самом языке С#. Соответственно, я попытался писать ее так, чтобы вы могли полностью сконцентрироваться на С#, не отвлекаясь. То, для чего вы позже решите использовать С#, — полностью ваше дело. Но все-таки программам нужен какой-то способ общения с внешним миром. Для этой книги я выбрал тип интерфейса пользователя, известный под названием консоль. Преимущество консоли — в ее простоте, а то, чему вы научитесь, пригодится для любых типов программ, которые вы впоследствии напишете. Если, например, прочитав эту книгу, вы захотите писать приложения для Windows, то обратитесь к главе 2 моей книги «Программирование для Microsoft Windows на С#» (Русская Редакция, 2002 г.)
СИСТЕМНЫЕ ТРЕБОВАНИЯ
Для написания и компиляции программ на C# уже сейчас разработана масса разнообразных инструментов, а в будущем их станет еще больше. Я постарался в этой книге избежать зависимости от конкретных инструментов. Тем не менее в тех немногих случаях, когда я считал необходимым описать, как создавать ваши программы на С#, я применял два подхода.
Стандартный способ программирования на C# — купить любую версию Microsoft Visual C# .NET Standard Edition (розничная цена — около $100) или любую версию Microsoft Visual Studio .NET Professional Edition (в рознице — приблизительно $1000). В Visual Studio .NET вместе с другими замечательными функциями реализована также поддержка С++ и Microsoft Visual Basic .NET. В этой книге я употребляю название Visual C# .NET для ссылки на любой из этих продуктов, за исключением тех случаев, когда мне нужно подчеркнуть различие между ними. Для работы с Visual C# .NET вам
X
Прелюдия
потребуется ОС Windows 2000 или Windows ХР. Рекомендуемая конфигурация — Pentium III 600 МГц, как минимум 160 Мб оперативной памяти, 2 Гб свободного места на жестком диске (4,2 Гб для Visual Studio .NET) и дисплей с разрешением не менее 1024 на 768 и поддержкой 256 цветов.
Если у вас установлен Visual C# .NET Version 2002 (но не Visual C# .NET Version 2003 и более поздние версии или любая версия Visual Studio .NET), то вам придется добавить небольшой файл для создания пустых проектов. Чтобы узнать об этом более подробно, зайдите на мой Интернет-сайт http://www.charlespetzoid.com и далее на страницу Programming in the Key of C#.
Я не уверен, что Visual C# .NET — это лучший инструмент для начинающего программиста. Он большой, сложный и подавляющий, и обладает гораздо большими возможностями, чем нужно новичку. Поэтому я написал маленькую программу, которую вы можете использовать вместо Visual C# .NET. Она называется Key of С#, и ее можно загрузить бесплатно с моего сайта. Однако прежде следуег загрузить (http://msdn.microsoft.com/downloads/list/netdevframework.asp) и установить .NET Framework Software Development Kit (SDK). Для работы с данной книгой годится любая версия .NET Framework SDK. Вам понадобится ОС Windows 2000, Windows ХР или более поздняя версия Windows. Объем загружаемого файла — около 100 Мб. Затем зайдите на http://www.charles-petzold.com, найдите страницу Programming in the Key of C# и установите Key of C#.
Если у вас уже установлен Visual C# .NET, то вы можете запустить Key of С#, не загружая .NET Framework SDK. Все возможности SDK включены в Visual C# .NET.
Если вам удобно пользоваться командной строкой MS-DOS в Windows и вы хотите лучше почувствовать, как работали программисты прежде, просто загрузите и установите .NET Framework SDK (или Visual C# .NET) и откройте окно командной строки MS-DOS. Подробнее о том, как для изучения этой книги работать с командной строкой компилятора С#, рассказано на странице Programming in the Key of C# моего сайта.
Прелюдия	Х|
ПОДДЕРЖКА
Программы-примеры для этой книги можно загрузить с сайта Microsoft Press http://www.microsoft.com/mspress/books/ 626hasp. Для этого щелкните ссылку Companion Content в меню More Information в правой части Интернет-страницы. Откроется страница Companion Content со ссылками для загрузки файлов-примеров. (Ссылка на сайт Microsoft Press есть также на странице Programming in the Key of C# на моем Интернет-сайте http://www.charlespetzold.com.) Программы-примеры включают файлы-решения (.sin) и файлы-проекты на C# (.csproj) для Visual C# .NET, а также файлы-проекты (.kcsproj) для моей программы Key of С#.
Мы приложили все усилия, чтобы содержание книги и исходного кода было точным и безошибочным. Microsoft Press ведет в Интернете список исправлений к книгам на h ttp://www. microsoft. com/mspress/support.
Чтобы обратиться непосредственно к справочной базе данных Microsoft Press и ввести запрос относительно возникшего у вас вопроса или проблемы, зайдите на страницу http:// www.microsoft. com/mspress/support/search. asp.
Если у вас есть замечания, вопросы или предложения по поводу этой книги, пожалуйста, отправляйте их в Microsoft Press одним из следующих способов:
по почте:
Microsoft Press
Programming in the Key of C#
One Microsoft Way
Redmond, WA 98052-6399
no электронной почте: mspinput@microsoft. com Пожалуйста, обратите внимание на то, что указанные адреса не относятся к службе поддержки продукта. Для получения поддержки относительно Visual C# .NET, Visual Studio .NET или .NET Framework, пожалуйста, зайдите на сайт Microsoft Product Support http://support. microsoft.com.
Цдя получения поддержки при работе с программой Key of С#, зайдите на мой сайт http://www.charlespetzold.com.
Несмотря на то, что мои ресурсы ни в коем случае не сравнятся с ресурсами корпорации, я постараюсь сделать все, что в моих силах, для поддержки этой программы.
XII
Прелюдия
БЛАГОДАРНОСТИ
Мне не удалось бы написать эту книгу без любви и поддержки Дейдры (Deirdre), а также уюта и покоя дома, который мы построили вместе.
Также неоценимы наши сборища но воскресеньям, вторникам и четвергам с друзьями, которые продолжают помогать и поддерживать меня мириадами способов.
Мой агент Клаудет Мур (Claudette Moore) из Moore Literary Agency и редактор Microsoft Press Даниэль Воллер (Danielle Vbeller) подключились к этому проекту па нулевом этапе и разрешили мне работать практически без графика, что позволило мне найти тональность для этой книги. Мой друг Брюс Экел (Bruce Eckel) па ранних стадиях проекта помог мне обрести уверенность в том, что ориентация па консольный интерфейс ввода-вывода — это не сумасшествие, а единственный точный выбор.
Что может быть лучше, чем работа с одним редактором проектов и одним техническим редактором Microsoft Press? Работа с двумя редакторами проектов и двумя техническими редакторами! Денис Бан-кайтис (Denise Bankaitis) и Джим Фухс (Jim Fuchs) сделали большую часть работы, но из-за летних отпусков и других изменений в расписании к работе были привлечены Сэлли Стикни (Sally Stickney) и Джулия Ксиао (Julie Xiao). Бели бы редакторы безжалостно не вычитывали эту рукопись, книга кишела бы ошибками в тексте и в программах. Редакторы делают намного больше, чем просто избавляют нас от повторов, уродливых фраз и отрывков сомнительной ценности. Они помогают автору увидеть работу с разных точек зрения. Также, неоценимую помощь в этом процессе оказал автор и преподаватель Робип А. Рейнольдс-Хертл (Robin A. Reynolds-Haertle), выявивший много скрытых допущений, неловких переходов и просто бессмыслицы. В любых недостатках, все-таки оставшихся в этой работе, следует винить исключительно мое упрямство.
Я чувствую, что обязан большей частью своей профессиональной жизни Уэнди Карлос (Wendy Carlos), чей альбом 1968 г. «Switched-On Bach» открыл для любознательного 16-летнего подростка не только музыку Баха, но и технологию электронной музыки. Десять лет спустя я обучился цифровой электронике. Создавая собственные контролируемые компьютером инструменты для электронной музыки, я постепенно убедился, что более талантлив в области микрочипов и кода, чем в сочинении музыки. Надеюсь, что программа в последней главе этой книги будет воспринята как дань уважения Уэнди Карлен (Wendy Carlos) и традиции «Switched-Оп Bach».
И, наконец, эта книга посвящается самому Иоганпу Себастьяну Баху, одному из немногих композиторов, имевших достаточно смелости писать музыку в тональности до-диез-мажор (key of С#).
Чарльз Петцольд
Нью-Йорк, Июнь 2003
Часть I
Начало
Preludio Ш.
"Vivace-.
ГЛАВА
Вы — программист
Поздно вечером, когда дневная работа закопчена, но мозг все еще гудит, бывает, программисты задают себе вопрос: «Программирование— это искусство или наука?»
Конечно же, оно включает и то, и другое. Подобно художнику, программист начинает с палитры основных инструментов, растягивает холст настолько широко, насколько позволяет память, и в порыве вдохновения начинает создавать уникальное творение там, где раньше существовали лишь беспорядочные биты. Но этот холст нельзя раскрашивать с абсолютно анархической импульсивностью. Синтаксические правила, управляющие инструментами программиро вания, с одной стороны, позволяют создавать бесконечное разнообразие конструкций, но в то же время они так же строги и неумолимы, как законы природы.
Программисты — это дизайнеры и строители, архитекторы и каменщики, провидцы и инженеры нашего времени. Сооружения, которые мы строим, становятся всемирными городами будущего, непрерывно расширяющимися сериями связей и соединений между людьми, сообществами и информацией, и зачастую их красотой действительно восхищаются лишь те, кто разделяет нашу страсть. С точки зрения непрограммистов наши творения редко заслуживают уважения — на них не обращают внимания, когда они работают хорошо, проклинают, когда они допускают ошибки, и оставляют, когда появляются новые — даже если они уже стали существенно важными в жизни пользователей.
Компьютерная программа — это величественный механизм. Если бы ее создавали из вращающихся шестеренок, рычагов и поршней, она бы наполнила наши комнаты музыкой умопомрачительной сложности. Мы бы видели логику движения, алгебру' действий, танец данных. Странная аналогия,
Вы — программист
3
но именно с такой точки зрения видит ее программист, когда части программы соединяются посредством механизмов обработки данных с точностью, не имеющей равных в материальном мире. Немногие радости могут сравниться с удовольствием заставить новую программу работать, увидеть, как она вдруг просыпается и оживает на глазах.
Подобные ощущения неведомы подавляющему большинству пользователей компьютеров. Масса людей, работающих с компьютерами в наше время, не программисты и никогда ими не станут. Они просто запускают приложения — текстовые процессоры, программы для работы с электронной почтой, Иитернет-браузеры, созданные другими людьми, или используют такие устройства, как мобильные телефоны, DVD-плееры, машины для выпечки хлеба, в недрах которых также трудятся компьютерные программы.
Но так было не всегда. До 1970 г. (или около того) получить что-либо полезное от компьютера без программирования было попросту невозможно. Компьютерная революция в действительности свершалась в два этапа — первый случился, когда компьютеры были разработаны и построены, а второй наступил несколько десятилетий спустя, когда компьютеры стали доступны непрограммистам. Родился компьютерный пользователь, и с тех саАмых пор программисты и пользователи не могут договориться!
Первые рабочие цифровые программируемые компьютеры были созданы в 1930-х гг. Говоря цифровые, (digital) я подразумеваю, что они работали с отдельными числами, например 0, или 1, или 3,14159, или 1,86-106. Говоря программируемые (programmable), я хочу сказать, что компьютеры могли выполнять целые последовательности математических операций, основанных на закодированных инструкциях, именуемых программой (program). В течение многих лет компьютерные программы кодировались с помощью маленьких дырочек: пробивавшихся в бумаге или картоне, или другом носителе. В конце концов компьютер стали называть оборудованием (hardware), а закодированные инструкции — программным обеспечением (software).
Программное обеспечение получило свое название, потому что его легко изменить. Не нужно переделывать весь компьютер для проведения нового вида расчетов. Оборудование создано для выполнения массы основных арифметиче
4
Глава 1
ских и логических операций. Тем, какие операции выполняет оборудование и в каком порядке, управляет код программы. Говорят» что компьютер исполняет (execute) программу, читает код и выполняет инструкции.
В течение первых двадцати лет эры цифровых компьютеров оборудование и ПО были тесно связаны. Каждая машина обладала собственным уникальным набором инструкций. Для переноса программы на более новую и быструю машину ее приходилось переписывать с новыми кодами. Эти наборы индивидуальных для каждой машины кодов стали называть машинными кодами (machine code) или (когда для представления кодов стали использовать английские символы) языком ассемблера (assembly language).
В начале 1950-х гг. стало реальным создание обобщенных компьютерных языков, которые не основывались на архитектуре и кодах отдельных машин. Эти языки стали известны как языки программирования высокого уровня (high-level), в отличие от низкоуровневых (low-level) машинных кодов. Некоторые из этих языков высокого уровня используются до сих пор. FORTRAN (от FORmula TRANslation) пока имеет верных последователей среди ученых и инженеров, в то время как COBOL (Common Business Oriented Language) все еще широко применяется на больших мэйнфреймах в финансовых упреждениях. BASIC (Beginner's All-purpose Symbolic Instruction Code), рождение которого датируется серединой 60-х гг., также еще популярен, хотя сегодняшняя его модификация сильно отличается от первоначальной версии.
Компьютерные программы, создаваемые сегодня на FORTRAN, COBOL, BASIC или других языках программирования высокого уровня, представляют собой, в сущности, текстовые файлы, которые состоят из последовательности операторов, написанных в соответствии со строгими, определяемыми конкретным языком правилами синтаксиса. Поскольку сам компьютер способен исполнять только машинный код, программа высокого уровня должна быть переведена в машинный код программой-компилятором (compiler) либо интерпретатором (interpreter). Компилятор переводит всю программу в машинный код, который затем исполняется компьютером, в то время как интерпретатор занимается и переводом, и исполнением программы.
Вы — программист
5
Еще один компьютерный язык, разработанный в конце 1950-х гг., не используется в настоящее время (насколько мне это известно), но он оказал огромное влияние на историю языков программирования. Это — ALGOL, название которого расшифровывается как ALGOrithmic Language, хотя так же называется и вторая по яркости звезда в созвездии Персея. Созданный в конце 1950-х гг. международной группой, ALGOL был позже доработан в 1960 и 1968 гг. Несмотря на то, что в наши дни ALGOL — в общем-то, мертвый язык, его дух продолжает жить в его потомках, среди которых Pascal, PL/I и С.
Язык С родился в Bell Telephone Laboratories. Трудно оценить влияние, оказанное Bell Labs на современный мир. В 1947 г. в Bell Labs был изобретен транзистор, а в 1970-х там была разработана операционная система UNIX. В течение многих лет с UNIX ассоциировался язык программирования, названный просто С. Его основным автором считается Деннис Ричи (Dennis Ritchie). Людям всегда любопытна история названия. С получил такое имя, потому что происходил от языка под названием В, а В был упрощенной версией BCPL (Basic CPL), в свою очередь разработанного на основе CPL (Combined Programming Language).
С лаконичнее большинства других языков программирования. В то время, как в ALGOLe (и многих его потомках) для выделения блоков используются слова BEGIN и END, в С использовались левая и правая фигурные скобки. Обычные операции были хорошо отлажены. Программы, написанные на С, зачастую очень эффективны, что означает, что они чаще всего компилируются в меньшее количество инструкций машинного кода по сравнению с программами на других языках. Значительная часть привлекательности С заключается в формализации указателей (pointers), которые, в сущности, представляют собой адреса памяти, позволяющие программистам выполнять некоторые задачи очень рационально. Некоторые даже называют С «высокоуровневым языком ассемблера», поскольку он хорошо работает на уровне бит, байт и памяти.
Эффективность С имеет свою цену, и каждый программист, работавший в С, знает, насколько опасным он может быть. Компиляторы для большинства других языков про
6
Глава 1
граммирования вносят в программу дополнительные инструкции для машинного кода, которые не дают программе совершить действие, вызывающее ошибку или аварию. Ради скорости генерации исполняемого кода компиляторы С не вносят таких инструкций. С предполагает, что программист умнее компилятора. Соответственно, в С даже опытные программисты могут написать код, содержащий ошибку. Ошибки (bugs) — обычная составляющая любого программирования, но С позволяет программистам писать код с ошибками, которые просто невозможны в других языках. Многие из этих ошибок связаны с указателями, возможностей которых хватает на то, чтобы позволять программе изменять те области памяти, которые вообще-то не должны затрагиваться.
Несмотря на то, что С — все еще популярный язык программирования, он слегка устарел. Сегодня мы классифицируем С как традиционный процедурный (procedural) язык — этот термин отсылает к структуре программ на С. Программа на С обычно состоит из множества процедур (procedures) [также называемых функциями (functions) или подпрограммами (subroutines)], каждая из которых — это фрагмент кода, исполняющий ту или иную задачу или реализующий определенный алгоритм. Эти процедуры обрабатывают данные (data) различными способами. Данные представляют собой цифры, текст или комбинацию цифр и текста. В традиционных процедурных языках программирования код перемалывает данные.
В наше время многие программисты предпочитают объектно-ориентированные (object-oriented) языки. Происхождение объектно-ориентированного программирования (ООП) обычно связывают с языком SmallTalk, разработанным в Palo Alto Research Center (PARC) — исследовательской лаборатории, основанной компанией Xerox. Именно здесь были созданы многие концепции графического интерфейса пользователя, которые в конце концов применяются в операционных системах Apple Macintosh и Microsoft Windows.
В объектно-ориентированных языках программисты создают классы (classes), а не процедуры, и из этих классов появляются объекты, представляющие собой сочетания кода и данных. Не процедуры обрабатывают данные, но данные обладают средствами для обработки самих себя. Данные перемалывают сами себя. Это смещение акцентов оказалось очень
Вы — программист
7
полезным для написания кода, который можно использовать повторно для разнообразных задач программирования.
Спустя годы несколько авантюристов от программирования попытались создать объектно-ориентированные версии С. Ту из них, которая в конце концов стала довольно популярной, разработал в Bell Labs в начале 1980-х гг. Бьерн Страуструп (Bjarne Stroustrup). Это — C++ (произносится «си плюс плюс»), в названии которого кроется шутка. Как вы узнаете из главы 6, двойной «плюс» в С увеличивает число на 1.
У C++ есть собственные проблемы. В теории C++ — это расширенный С. Он не заменяет функции С, но добавляет новые. Это привело к некоторым странностям в системе обозначений в C++, которые многим людям показались уродливыми и неудобными.
Более того, то, что когда-то считалось привлекательным в С и C++ — низкоуровневая природа, использование указателей — все чаще выглядело как значительный дефект. За последние годы сообщество программистов значительно возмужало, и мы переросли ту пору, когда быстродействие и экономичность служили главными критериями. Оборудование стало таким быстрым, а память — такой дешевой, что мы можем позволить себе уделить внимание гораздо более важной задаче — созданию кода, свободного от ошибок, насколько это возможно, даже если это означает потерю некоторой эффективности С.
В 1990-х гг. Sun Microsystems создала lava, объектно-ориентированный язык, основанный на С, однако значительно отличающийся от C++. Java очищен от некоторых уродливых особенностей синтаксиса C++ и некоторых опасных функций С, но в нем в основном сохранена лаконичность С.
В 2000 г. корпорация Microsoft представила C# (произносится «си шарп»), разработанный Андерсом Хейлсбергом (Anders Hejlsberg); этот язык продолжает традицию каламбура в названии. Знак диеза выглядит почти как два «плюса» C++, сдвинутых вместе. И, конечно, в музыке высота звука C# (до диез) чуть выше, чем звука С (до).
Как и в Java, в C# убраны многие опасные функции С. Указатели не были полностью изгнаны из С#, но они не являются необходимыми для подавляющего большинства рутинных операций программирования.
8
Глава 1
Другое сходство между Java и C# заключается в роли компилятора. Традиционно компилятор переводит исходный код (source code) (текстовый файл высокоуровневого языка) в машинный код. Машинный код образует исполняемый (executable) файл» готовый к запуску на компьютере. Но поскольку машинный код связан с конкретным типом машин, исполняемый файл может запускаться только на компьютерах этого типа. Именно поэтому вам не удастся запустить одни и те же программы и на Apple Macintosh, и под Microsoft Windows.
Компилятор же C# переводит исходный код в lL-код (intermediate language, IL), представляющий собой обобщенный машинный код. Только когда вы запускаете программу на конкретной машине, 1L трансформируется в машинный код. Пользователь эту операцию не видит. Теоретически двухступенчатый процесс позволяет запускать одни и те же программы в IL на разных типах компьютеров. Кроме того, программа в формате IL более легко проверяется системой на наличие вредоносного или разрушительного кода. Важность этой особенности возрастает при обмене программами через Интернет.
С, C++, Java и C# сейчас известны как языки семейства С или языки, основанные на С. C++ представляет собой расширенную версию С, то есть в C++ есть все, что и в С, плюс еще что-то. Java и C# в строгом смысле нельзя назвать расширенной версией С, и друг на друга они похожи больше, чем на C++. Но в каждом из них используется сходный синтаксис, отличающийся от применяемого в любом другом языке программирования. В этой книге я время от времени буду упоминать, унаследована ли та или иная функция C# от С, чем она отличается от С, или же в С ее нет вообще, только чтобы вы лучше поняли взаимосвязь С, C++ и С#.
Изучение языка программирования иногда сравнивают с изучением иностранного языка. Безусловно, сходство есть. Например, в обоих языках есть наборы словарей, хотя словари языков программирования относительно малы. В C# определены только 77 ключевых слов (keywords), которые перечислены на внутренней стороне обложки этой книги. Согласно сложившейся традиции С все ключевые слова C# пишутся строчными буквами.
Вы — программист
В языках программирования используются правила синтаксиса и грамматики, хотя они гораздо проще, однако же и гораздо строже, чем в человеческих языках. Как-никак, синтаксис компьютерной программы должен быть достаточно простым, чтобы его полностью и недвусмысленно интерпретировал компилятор. Пока что ни одна программа не может считывать текст на человеческих языках с такой же легкостью и точностью.
Большое сходство в изучении языка программирования и иностранного языка состоит в том, что ни один из них нельзя выучить, просто читая книгу. Необходима практика. Причем практиковаться требуется так же много, как если бы вы учились играть на музыкальном инструменте. Придется писать собственный код. Когда вам в первый раз приснится код (боюсь, обычно это не самое приятное переживание), вы поймете, что действительно учитесь думать, как программист.
Программирование — это действия, направленные на решение проблем. Самое главное качество программиста — это способность раскладывать задачи на составные части, разбивать их на маленькие кусочки. Инструментарий, предлагаемый С#, в действительности применим только к маленьким фрагментам. И ответственность за то, как сложить эти кусочки обратно вместе, чтобы решить задачу, лежит на программисте. Эта способность также совершенствуется с практикой.
Внимание к деталям безусловно полезно. Программирование не терпит небрежного мышления или решений, которые работают лишь в 99% случаев. На протяжении этой книги я постараюсь научить вас думать, как программист, но мои возможности ограничены тем, что я умею сам. Как и в любом пособии по программированию, большинство приведенных в этой работе примеров — очень короткие, они предназначены для иллюстрации одного аспекта программирования на С#. В реальности программы намного объемнее. Написанию длинных программ нужно учиться постепенно, на практике, сначала набираясь опыта на небольших примерах.
В этой книге я постарался отделить сам язык C# от сред, в которых он используется. Вы можете на C# писать изолированные программы, работающие под Windows, например приложения для Web-страниц. Со временем C# будет ис
-| Q	Глава 1
пользоваться для других приложений. Во всех этих программах на C# применяются различные способы ввода данных пользователем и вывода результатов. C# не навязывает какую-либо одну конкретную модель ввода-вывода. Это большая тема, и рассказ о ней выходит за рамки этой книги.
Чтобы свести к минимуму эти проблемы, здесь я покажу вам, как писать программы на C# для очень старомодного, простого донельзя устройства ввода-вы вода под названием консоль (console). В давно минувшие годы программисты, градуировавшие перфокарты, работали на телетайпах. Позднее первые персональные компьютеры называли видеодисплей консолью, и именно ее операционные системы типа MS-DOS являли своим пользователям в годы, предшествовавшие появлению графических интерфейсов, типа Windows. Даже в Windows консоль существует в виде окна командной строки.
Хотя вы скорее всего не будете много программировать для консольных приложений, знакомство с ними ни в коем случае нельзя назвать бесполезным опытом. Многие опытные программисты используют консоль для разработки особенно мудреной части кода или позже, для отладки. Чего бы вы ни достигли в программировании на С#, могу вас заверить, что все, о чем идет речь на этих страницах, окажется полезным.
Пособие, подобное этому, не может быть ни абсолютно полным, ни безупречно точным. Например, в следующей главе я заявляю: «Единственный тип операнда, который разрешено использовать слева от знака равенства, — это переменная». Это не совсем верно. Здесь также могут находиться свойст ва и элементы индексатора. Но это вам пока не нужно в главе 2. Со временем вы узнаете все детали.
Формализованный документ «С# Language Specification» существует в виде книги, изданной в 2001 г. издательством Microsoft Press (книга так и называется «С# Language Specifications» — во множественном числе), и также доступна в электронном виде. Со временем вам захочется попробовать «на зуб» эту книгу, но прежде следует близко познакомиться с С#. Я буду время от времени обращаться к «С# Language Specifications» в этой книге. Все разделы этого документа удобно пронумерованы.
Вы — программист
Несмотря на то, что «Спецификация языка С#» — абсолютный авторитет при разрешении вопросов, касающихся С#, более «дружественное для пользователя» пособие — «С# Programmer’s Reference», доступное в электронном виде. Издательство Microsoft Press опубликовало его под названием «Microsoft Visual C# .NET Language Reference» (2002). Оно полезно для получения быстрой справки, но также включает некоторую информацию, которой больше нигде нет.
Оба этих документа, а также, масса другой информации по программированию, доступны на Web-сайте MSDN (Microsoft Developer Network) (http://msdn.microsoft.com). Когда я работал над этой книгой, страница, посвященная С#, имела адрес http://msdn.microsoft.com/library/en-us/cscon/html/ vcoriCStartPage.asp. Если вы не найдете ее там, обновленная ссылка скорее всего окажется на странице Programming in the Key of C# на моем Web-сайте. Адрес этой страницы http:// www. charlespetzold. сот/key.
ГЛАВА
Первые присваивания
Электронные вычислительные машины (компьютеры) и программирование изобретались для выполнения вычислений, поэтому не удивительно, что многие языки программирования заимствовали отдельные элементы алгебры, в том числе буквы и слова для обозначения чисел.
Вот небольшое алгебраическое выражение:
А = 3
В = 2
С = А + В
Конечно, оно весьма несложное, но если мы научим ком пыотер его решать, то сможем научить компьютер решать и более сложные задачи. Первым шагом станет преобразование алгебраических выражений в выражения на языке С#. Вот наш пример на С#:
А = 3;
В = 2;
С = А + В;
Эти три строки кода не составляют полной программы на О, но их легко найти в обычной программе на этом языке, возможно, одной из тех, что вы пишете сами. Как вы увидите в главе 4, подобный код можно набрать в редакторе ( гаком, например, как простейший текстовый процессор), а потом запустить компилятор, чтобы преобразовать программный код в исполняемый файл.
Единственное видимое различие между алгебраическими выражениями и строками кода — это то, что каждая строка кода C# оканчивается точкой с запятой. Каждая из э тих строк в языке С* называется оператором. Компьютерные программы по большей части состоят из различного рода операторов.
Первые присваивания
Буквы А, В и С называются переменными и, — если вы хотите технических подробностей, — переменные обозначают место в памяти, где хранятся их значения.
Видимая схожесть между алгебраическими выражениями и операторами языка C# на самом деле несколько обманчива. Причина этой обманчивости — в роли знака равенства, которая не одинакова в программировании и в алгебре. Например, некто вам показал такие три алгебраические выражения:
А = 3
С = А + В
В = 2
Мгновение вы можете поколебаться, но затем скажете: «С равно 5». Это происходит, поскольку алгебраическое выражение, подобное «В = 2», означает некое неизменяемое значение В; это похоже на утверждение «Пушок — это кот».
Но в языке C# менять порядок выражений, как в приведенном ниже примере, нельзя:
А = 3;
С = А + В;
В = 2:
Операторы в языке C# выполняются компьютером последовательно, одно за другим. Результатом первого будет присваивание переменной А значения 3. Только после его выполнения А станет равно 3. При выполнении второго оператора переменной В еще не присвоено значение 2. Мы не знаем, чему равняется В. Мы видим только маленькую часть программы.
В языке C# точное название знака равенства — оператор присваивания. Оператор — это символ или короткое слово, которые заставляют компьютер что-то сделать — выполнить операцию. Операторы имеют операнды. Оператор присваивания имеет два операнда: переменную слева от знака равенства и выражение справа от него. Оператор присваивания заставляет переменную слева от знака равенства быть присвоенной значению, вычисляемому выражением справа. В трех приведенных выше строках показаны примеры операторов присваивания— наиболее распространенного в компьютерных программах типа операторов.
14
Глава 2
Операторы присваивания имеют множество разных форм. Все приведенные ниже допустимы в языке С#:
С = А + 3;
С = 27 + А + В;
С=В+А+А+В+А+В+14;
С = 45 + 27;
В каждом из этих случаев переменной, расположенной слева от знака равенства, присваивается вычисленное значение выражения, расположенного справа. Знак «плюс» — одни из нескольких арифметических операторов языка С#. Конечно, язык C# дает вам возможность использовать также вычитание, умножение и деление, о чем я расскажу в главе 6.
Вот совершенно правильный оператор присваивания в С#: В = В + 5;
В алгебре это выражение не имеет смысла. А в C# оно означает, что к текущему значению переменной В прибавляется число 5. Если В было равно 17 до выполнения этого оператора, то после его выполнения оно станет равным 22.
Следующее выражение верно в алгебре, по неверно в С#: С + 5 = 4;
Единственный тип операнда, который разрешен слева от знака присваивания, — это переменная.
Операторы, которые я приводил до сих пор, содержали переменные, точки с запятыми, операторы присваивания, операторы сложения, а также числа, такие, как 2 и 3. Если говорить более точно, эго целые литерал ы, то есть целые числа, без десятичной запятой и без дробной части. Для записи отрицательного целого числа можно использовать знак «минус» перед числом:
А = -39;
Но не ставьте в больших числах между группами разрядов запятые1:
А = 3.546,128;
Это недопустимо в С#. Возможно, вы удивитесь, узнав, что этот оператор верен в языке С, но после его выполнения А
Разделение разрядов запятыми принято в английском языке. — Прим, перев.
Первые присваивания
15
станет равно 3 — скорее всего это совсем не то, что подразумевал программист.
Переменные называются так, потому что они могут меняться. Следующий фрагмент демонстрирует, каким образом может изменяться значение переменной:
А = 3;
В = 2;
С = А + В;
В = 4;
С = А ♦ В;
После выполнения третьего оператора С равно 5. После выполнения пятого — С равно 7. Если в алгебре вы говорите: «Теперь В равно 4», то на самом деле речь идет совершенно о другом. В программировании же значения переменных могут изменяться очень часго. Некоторая переменная может содержать, например, почтовый индекс, и во время выполнения программы ей будут присваиваться тысячи разных значений, если программа обрабатывае т тысячи разных адресов.
Чтобы избежать путаницы между алгебраическими выражениями и операторами, программисты иногда называют знак равенства извлечением, например «С извлекает А плюс В», или присваиванием, например «С присваивается А плюс В». Другие называют его gozinta (от goes into — переходить) — «А плюс В переходит в С».
Использование точки с запятой в конце оператора является обычным в языках программирования, происходящих от ALGOL. Это необходимо, поскольку C# разрешает писать код в свободной форме. Вам вовсе не обязательно выравни вать все красиво и по линейке. Можно втиснуть несколько операторов в одну строку, например, так:
А=3;В=2;С=А+В;
Или растянуть их по нескольким строкам:
А
=	3
: В
2
; С = А
+
В
16
Глава 2
Если вы будете читать этот микс слева направо и сверху вниз (как это безропотно делает компилятор), то в обоих случаях получите одну и ту же последовательность символов. Когда компьютер встречает точку с запятой, он понимает, что один оператор закончился и может начаться следующий.
Пробелы и переводы строки называются неотображае-мымн символами. Программисты часто используют их в эстетических целях — чтобы сделать программы более легкими для чтения. Например, я люблю отделять операторы присваивания и арифметические операторы пробелами с обеих сторон:
А = 3;
В = 2; С = А + В;
Но вы не обязаны делать так же.
Хотя имена переменных Л, В и Сочень просты и удобны» но вы вольны в выборе имен:
HAYDN = 3:
London = 2;
Symphonyl04 = HAYDN + London;
C# чувствителен к регистру букву что означает, что вы можете использонать в именах переменных и строчные, и прописные буквы, но должны делать это последовательно. Имя London — не то же самое, что london. Следующий фрагмент содержит три разных переменных:
London = 3;
london = 2;
LONDON = London ♦ Icmdon;
Чтобы минимизировать возможную nyiainioy, вы, ско рее всего» захотите избежать использования имен, отличаю щихся только регистром букв.
Правила создания правильных имен переменных в С-сравнительно сложны, поскольку имена могут содержать символы разных алфавитов, в том числе русскою и арабского. Например, вы можете использовать в именах символы греческого алфавита: а = 3;
Р = 2;
у = а + р;
Первые присваивания
Если вам захочется использовать имена переменных, подобные приведенным выше, придется установить соответствующие раскладки клавиатуры, воспользовавшись значком Regional And Language Optinions (Языки и региональные стандарты) в Панели управления Windows. Хотя использование греческих букв в именах переменных допустимо, применять в них римские числа нельзя.
Если ограничиться символами, которые вы можете ввести с клавиатуры с английской раскладкой, то правила образования имен переменных сравнительно просты:
	имена переменных должны начинаться с буквы или символа подчеркивания;
	имена переменных должны содержать только буквы, цифры и знаки подчеркивания.
Уяснили? Имя переменной может содержать цифры (как, например, Symphony 104, которое я использовал раньше), но не может начинаться с цифры. Иначе оно будет слишком похоже на число — и для компилятора С#, и для программистов, работающих на С#.
Имена переменных не могут содержать пробелов или каких-либо знаков пунктуации, за исключением символа подчеркивания. В именах переменных, состоящих из нескольких слов, как правило, для отделения слов друг от друга используют символы подчеркивания:
population_of_new_jersey = 8414350;
А в последнее все чаще используют строчные и прописные буквы:
PopulationOfNewJersey = 8414350;
Однако некоторые слова нельзя использовать в качестве имен переменных. Эти слова называют ключевыми, они зарезервированы за самим языком С#. Таких слов вС# — 77, они перечислены в Приложении.
Лучше всего использовать для переменных значащие имена. Кому-то может потребоваться прочитать вашу программу или вы сами захотите вернуться к ней через несколько лет после того, как ее написали. Вы обнаружите, что если имя переменной показывает, для чего переменная используется, то это большое подспорье:
18
Глава 2
NumberOfChildHovieTicketaDesired = 3;
NumberOfAdultMovieTicketsDesired = 2:
TotalNumberOfMovieTicketsToBelssued =
NumberOfChildMovieTicketsDesired +
NumberOfAdultMovieTicketsDesired;
Обратите внимание, что третий оператор получился сравнительно длинным, поэтому он занял три строки. Если он занимает больше одной строки, то вторую и последующие строки часто сдвигают вправо чтобы сделать все выражение более читаемым. Поскольку детальные имена переменных могут оказаться довольно длинными, вы можете облегчить нудный набор имен, используя более короткие, но практически такие же понятные сокращения
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
Хотя нам, людям, совершенно понятно, что мы хотим сделать такой программой, эти три выражения не являются полной программой на С#. Чтобы начать работу, компилятору нужно больше информации, и это станет темой третьей главы.
ГЛАВА
Объявления цели
Перед использованием в Сопрограмме конкретной переменной вы должны сказать компилятору, какого она типа. Нам может показаться вполне очевидным, что переменная просто ссылается па число. Однако переменные могут быть не только числами, кроме того, в C# даже предусмотрены разные типы чисел.
C# поддерживает три различных типа чисел.
	Если бы вы писали программу, связанную, например, с народонаселением, вам, возможно, пришлось бы использовать целые числа (integer). Не существует такого понятия как дробный человек, конечно, если вы не счи таете усредненных значений или чего-то подобного.
	Если бы ваша программа работала с деньгами в (что довольно обычно в некоторых отраслях), вам, вероятно, потребовались бы десятичные числа (decimal), такие, как доллары и центы.
	Если бы вы писали приложение для научных расчетов, вам, наверное бы, пришлось выражать числа в принятой в этой области системе представлений. В программировании такие числа называются числами с плавающей точкой (floating point).
Вы можете сметнивать все три типа чисел в одной программе. Но сейчас давайте использовать тип integer, к которому относятся целые числа, как положительные, так и отрицательные.
Вы сообщаете компилятору о том, что хотите использовать конкретное имя переменной, когда вы объявляете переменную в операторе объявления (declaration statement). В операторе объявления вам нужно указать тип (type) переменной, то есть указать тип числа (или чего-то другого), который вы хотите присвоить переменной. Конкретная переменная может быть объявлена только один раз.
2Q	Глава 3
C# (как С и C++ прежде) использует слово int (рифмуется с «mint»1) для обозначения целого числа. Вот так можно объявить переменную ChildTkts как целое число:
int ChildTkts;
Оператор объявления указывает тип переменной, его располагают слева от имени переменной. Вы можете сказать: «Тип ChildTkts— int», или «ChildTkts — переменная типа int», или «ChildTkts — объект типа int».
Вы не вправе назвать свою переменную int, так как int — это ключевое слово в С#, но вы можете назвать ее Intили INT.
При выполнении программы па C# оператор объявления вызывает небольшой объем памяти специально для хранения значения переменной. Говорят, что память выделяется для переменной.
Вот как может выглядеть программа с операторами объявления и присваивания.
int ChildTkt;
int AdultTkts;
int TotalTkts;
ChildTkts - 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
Пустая строка посередине необязательна; она только помогает визуально структурировать программу — сначала операторы объявления, затем операторы присваивания.
Вы можете указывать более одной переменной в одном операторе объявления:
int ChildTkts, AdultTkts, TotalTkts;
Этот единственный оператор объявления эквивалентен трем отдельным операторам объявления. Когда более одной переменной указывается в операторе объявления, их имена следует разделить запятыми. Все объявленные переменные будут относиться к одному типу.
Существует множество различных способов записывать объявления переменных. Не обязательно указывать их в том порядке, в котором они будут использоваться:
Большая сумма, большое количество. — Прим. пере#.
Объявления цели
int TotalTkts, AdultTkts, ChildTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
Вы можете объявлять некоторые переменные вместе, в одном операторе объявления, а другие отдельно.
int ChildTkts. AdultTkts; int TotalTkts;
Вы можете даже объявлять переменные по мере надобности:
int ChildTkts;
ChildTkts = 3; int AdultTkts;
AdultTkts = 2; int TotalTkts; TotalTkts = ChildTkts + AdultTkts;
Здесь операторы объявления и присваивания чередуются. Единственное правило заключается в том, что каждая переменная должна быть объявлена до ее использования.
Также возможно присвоить переменной значение одновременно с объявлением. На первый взгляд следующий оператор можно принять за оператор присваивания, но на самом деле это оператор объявления:
int ChildTkts = 3;
Когда переменной присваивается значение при объявлении» говорят, что переменная инициализируется. Вы можете присвоить этой переменной другое значение и далее в программе. Инициализация переменной в операторе объявления ничем не отличается от присваивания значения переменной сразу за оператором объявления:
int ChildTkts;
ChildTkts = 3;
С момента объявления переменной и до момента, когда ей в первый раз присваивается значение, переменная не инициализирована. Она не имеет никакого значения или скорее всего имеет какое-то случайное значение. Компилятор C# не разрешит вам использовать неинициализированную пере
2-1329
Глава 3
менную. Например, рассмотрим такую последовательность операторов:
int ChildTkts, AdultTkts. lotallkts;
TotalTkts = ChildTkts + AdultTkts;
Переменным ChildTkts и AdultTks не присвоено никаких значений, поэтому вы не можете посредством их вычислить TotalTkts.
В одном операторе объявления вы можете инициализировать одни переменные и не инициализировать другие.
int ChildTkts. AdultTkts = 2. TotalTkts;
Обратите внимание» что три переменные в операторе объявления по-прежнему разделяются запятыми.
Возможно даже инициализировать все три переменные в одном операторе объявления:
int ChildTkts = 3, AdultTkts = 2, TotalTkts = ChildTkts + AdultTkts;
Инициализация TotalTkts представляет собой выражение, содержащее две другие переменные. В этом случае TotalTkts должна быть объявлена и инициализирована после того, как обе переменные — ChildTkts и AdultTkts — объявлены и инициализированы.
Вставив слишком много данных в один оператор присваивания, вы можете сделать программу трудно читаемой. Три следующих объявления — и короткие, и понятные:
int ChildTkts = 3;
int AdultTkts » 2;
int TotalTkts = ChildTkts + AdultTkts;
Краткость и ясность — отличные цели при программировании.
К сожалению, мы все еще не создали завершенную C# программу. В С#, как во многих современных языках программирования, код состоит из элементов, которые называются классами (classes) и методами (methods). Каждый метод содержит код, который производит определенную работу. (В других языках программирования методы могут называться функциями, процедурами или подпрограммами.) Связанные методы образуют класс. Простейшая программа на C# состоит из одного класса, содержащего один метод. Каждая Сопрограмма должна иметь по меньшей мере метод
Объявления цели
23
Main. Это всегда первый метод в программе, который компьютер выполняет. Main часто называют точкой входа в программу. Для очень коротких программ (таких, какие мы будем писа ть некоторое время) Main будет зачастую оставаться единственным методом в программе. Хотя Main играет особую роль в С#, это не ключевое слово. Вы можете назвать переменную Main, если захотите.
Как и переменные, Main должна быть объявлена в вашей программе. Объявление метода лишь немного сложнее, чем объявление переменной.
Методы часто имеют входные (input) и выходные (output) данные. Например, для метода, который вычисляет комиссии с продаж, входными данными будет число продаж, а выходными — комиссия. Метод, подобно маленькому заводу, берет сырье и производит продукт. В основном метод получает данные в виде некоторых переменных, которые называются пара-метрами (parameters). Он перемалывает эти переменные оп-ределнным образом и затем выдает результат, который называется возвращаемым значением (return value).
Впрочем, реальных примеров параметров и возвращаемых значений придется подождать, потому что версия метода Maim которую мы напишем сейчас, не имеет ни входных, ни выходных данных. Объявление метода Main должно отражать этот факт и в действительности показывать отсут ствие параметров и возвращаемого значения.
Давайте начнем объявление метода с его имени:
Main
Запомните, что C# чувствителен к регистру. Main должно начинаться с заглавной «М».
Обычно параметры метода указываются вслед за именем метода в перечне переменных, заключенном в круглые скобки. Гак как у этой версии Main нет параметров, за словом Main пишут пустые круглые скобки:
Main()
Когда метод имеет возвращаемое значение, его тип (например, int) указывается слева от названия в объявлении метода. Когда метод не имеет возвращаемого значения, используют ключевое слово void для обозначения этого факта:
void Main()
24
Глава 3
Позвольте мне указать на некоторую схожесть между объявлениями переменных и методов: при объявлении переменной ее тип указывается слева от названия; таким же образом при объявлении метода возвращаемое значение указывается слева от его названия.
Однако еще одно ключевое слово необходимо в объявлении Main, Ключевое слово static располагается слева от названия возвращаемого типа:
static void Main()
Боюсь, что для определения точного значения и смысла ключевого слова static придется рассматривать концепции C# на значительно более сложном уровне, чем те, что я собираюсь обсуждать сейчас. Пока что вы можете считать, что слово static указывает на то, что этот метод основан сам по себе, что это константа, которая не изменяется во время выполнения программы.
Объявление метода также включает в себя тело (body), являющееся собственно кодом, который и составляет метод. Тело метода заключено в фигурные скобки, ко торые следуют за списком параметров, сначала левая фигурная скобка, затем правая: static void Main() {
Я поместил фигурные скобки на разных строках, потому что так принято. Но C# — язык свободных форм; вы вправе поставить фигурные скобки в той же строке, где и остальные элементы объявления метода Main.
Код па С#, который и составляет метод, помещают внутри фигурных скобок. Давайте запишем операторы объявления и присваивания из тех, которые приводились выше в этой главе:
static void Main() {
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
}
Группа операторов С#, заключенная в фигурные скобки, часто называется блоком (block). Таким образом, если вы хо
Объявления цели
25
тите подумать об этом формально (как поступает С#-компи-лятор), объявление метода состоит из модификатора (здесь это ключевое слово static). возвращаемого типа (void). имени метода (Main), списка параметров» заключенного в круглые скобки, и блока содержащего код метода.
Большинство программистов предпочитает выделять отступами операторы в блоке:
static void NainO {
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
Визуально, отступы обозначают, что операторы находятся где-то внутри метода, что, собственно, так и есть. Число пробелов, которыми вы обозначаете отступы в ваших программах, может быть любым. Большинство программистов используют не меньше двух, но не больше восьми пробелов. В этой книге отступ составляет четыре пробела.
Некоторые программисты (только не я) предпочитают ставить первую фигурную скобку в той же строке, что и начало объявления метода:
static void Hain() {
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts; }
Другие программисты (и я примерно до 1997 г.) предпочитают ставить отступ для фигурных скобок такой же, как и для кода:
static void Main()
<
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts a 2;
TotalTkts = ChildTkts + AdultTkts;
}
26
Глава 3
А есть еще любители, которые одним отступом в два пробела обозначают скобки и другим отступом в два пробела — код внутри скобок:
static void Hain(>
{
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts • ChildTkts + AdultTkts;
Компилятору C# безразличен ваш стиль добавления отступов. Компания, в которой вы работаете, может установить какой-то конкретный стиль, а ваши друзья-программисты — иметь собственные предпочтения. В любом случае просто выберите определенный стиль и последовательно придерживайтесь его.
Увы, несмотря на то, какой стиль вы предпочитаете, объявление метода Main — все еще нельзя считать завершенной программой. В C# все методы должны принадлежать классу (class) или структуре (structure). Эти два элемента очень похожи, поэтому пока я не укажу обратного, все, что я говорю о классах, применимо и к структурам.
В языках объектно-ориентированного программирования, например С#, класс представляет собой основной организационный элемент кода и данных. Что это значит, станет понятно по мере изучения этой книги. Программа на C# всегда содержит один класс или более. В каждом классе может быть один или несколько членов (member), это понятие включает в себя методы, такие, как Main.
Простейшая программа на C# состоит из одного класса, содержащего один член —метод Main.
Объявление класса начинается с ключевого слова class, за которым следует название класса — его вы (программист) придумываете самостоятельно:
class MyVery FirstProgram
Правила для именования классов аналогичны правилам для именования переменных. Названия переменных и классов попадают в категорию идентификаторов (identifiers), это названия которые вы придумываете. Все идентификаторы
Объявления цели
должны начинаться с буквы или подчеркивания и должны содержать только буквы, цифры и подчеркивания. Вы не можете использовать ключевые слова в качестве идентификаторов. Хотя Main не является ключевым словом, вы не можете использовать его как название класса, если класс также содержит метод Main.
Объявление класса также включает пару фигурных скобок, которые определяют содержимое класса:
class MyVeryFirstProgram {
}
Внутри фигурных скобок вы можете указать методы, такие, как Main, который мы создали ранее. Принято обозначать отступами все члены класса, это значит, что содержимое метода отделено двойным отступом:
class MyVeryFirstP год гага {
static void Main()
int ChildTkts, AdultTkts, TotalTkts;
ChildTkts = 3;
AdultTkts = 2;
TotalTkts = ChildTkts + AdultTkts;
}
}
И вот она — полная, функциональная Сопрограмма. Программа содержит один класс MyVeryFirstP rogramm. Класс MyVeryFirstProgranvn содержит один метод — Main. Метод Main объявляет три переменные типа int. Программа закапчивается тремя операторами присваивания.
Следующий шаг — набрать программу па компьютере, откомпилировать ее и запустить. Это я и продемонстрирую в следующей главе.
ГЛАВА
Редактирование, компиляция, запуск
Компьютерная программа начинает свою жизнь как текстовый файл, который вы (программист) пишите. Этот файл часто называют исходным кодом (source code) программы. По договоренности файлы исходных кодов C# имеют расширение .CS (что означает С Sharp). Программа состоит из одного или более файлов исходных кодов.
После создания файла или файлов исходных кодов вы компилируете программу, запуская компилятор. Компилятор С* — это программа, которая читает исходный текст и создает II.-код, обычно в виде файла с расширением EXE (что означает Executable— исполняемый). Очень часто... очень, очень часто ваш исходный код не идеален. Если компилятор обнаруживает проблему в нем, он сообщит вам об этом. Такие проблемы обычно называются синтаксическими ошибками (syntax errors), или ошибками в процессе компиляции (compile lime errors), или просто ошибками компиляции (compile errors). Если компилятор обнаружил какие-то ошибки, вы должны вернуться и исправить исходный код, чтобы разрешить проблему. (Иногда ошибки компиляции называют ошибками компилятора, как будто компилятор их и создает. Хотя известно, что компиляторы все-таки могут делать ошибки, гораздо чаще они их находят в вашем коде.)
Когда вы наконец заставите компилятор создать ЕХЕ-файл, вы можете запустить программу. Программа сейчас находится под управлением операционной системы и в случае программ О —под управлением общеязыковой исполняющей среды .NET. Очень часто... очень, очень часто, ваша про грамма не будет делать именно то, что вы хотели. Иногда она будет пытаться делать то, что ей не позволено (например, по
Редактирование, компиляция, запуск
29
лучить доступ к памяти, которая ей не предназначена), тогда программа сама, будучи связанной с общеязыковой исполняемой средой, сообщит вам об этой проблеме, обычно посредством всплывающего диалогового окна. Такие проблемы называются ошибками выполнения (runtime errors) или исключениями (exceptions). И снова вам придется вернутся к исходному тексту и попытаться решить проблему.
Целиком этот процесс называется циклом «редактирование — компиляция — запуск» и составляет основную часть процесса разработки программы (program development). Для всех программ, кроме, может быть, самых маленьких, исключительно редко удается получить отлаженную версию посредством лишь одного такого цикла. Когда вы пишите большую программу, вам захочется начать этот цикл как можно скорее. Вы начнете с маленького фрагмента и будете постепенно расширять его в процессе многократных циклов разработки.
Когда в конце концов вы получите программу, которая, как вам кажется, будет работать правильно, в обязательном порядке вы должны ее протестировать. И зачастую будет выясняться, что программа все еще работает не совсем верно. Выявленные таким образом проблемы называются ошибками программы (bugs). Иногда такие ошибки найти легко, иногда нет. Отладка — эго по сути целая наука (или, может быть, искусство?), и рассказ о ней остается за рамками этой книги. В книге «Code Complete» Стива Макконнела (Microsoft Press, 1993) есть хорошая глава по отладке, так же как и множество другой необходимой информации для программ иегов.
Как я упоминал в разделе «Прелюдия», вам доступно несколько способов редактирования и компилирования ваших программ С#. Наиболее стандартный вариант — Microsoft Visual С* .NET или (если вы будете использовать разные язы ки программирования и у вас водятся деньги) Microsoft Visual Studio .NET. Я буду называть Visual C# .NET оба пакета. Visual C# .NET это — сложная интегрированная среда разработки (integrated development environment, IDE).
В среде Visual C# .NET программы называются проектами (projects). Проект может содержать один или более файлов исходных кодов. Чтобы создать новый проект в Visual C# .NET, выберите пункт меню File I New I Project. В открыв
30
Глава 4
шемся диалоговом окне выберите Visual C# Projects слева и Empty Project (пустой проект) справа. Укажите расположение и название вашего проекта. Чтобы создать программу приведенную в конце предыдущей главы, вы можете использовать название MyVeryFirstProgram. Оно станет названием по умолчанию .ЕХЕ-файла. Название проекта не чувствительно к регистру.
Затем добавьте С#-файл в проект. Выберите пункт меню File I Add New Item. В появившемся диалоговом окне выберите Local Project Items слева и файл текста программы справа. Дайте название файлу исходного кода. Если проект содержит только один файл исходного кода, ему обычно дается название проекта, в данном случае — MyVeryFirstProgram.cs. Название файла тоже не чувствительно к регистру.
Вы будете работать в редакторе Visual C# .NET который напоминает усложненную версию Windows Notepad. Здесь вы вводите и редактируете свой код. Вы можете начать с набора программы из предыдущей главы. Для вашего удобства здесь он приводится еще раз.
MyVeryFirstProgram.cs
Class HyVeryFirstProgram
static void Hain() {
int ChildTkts, AdultTkts. TotalTkts;
ChildTkts “ 3;
AdultTkts e 2;
TotalTkts = ChildTkts. + AdultTkts;
}
Нажимайте Enter в конце каждой строки. Вы заметите, что редактор Visual C# .NET показывает все ключевые слова голубым цветом. Редактор использует разные цвета для раз ных элементов вашей про|раммы.
Пара предупреждений: редактор Visual О .NET будет пытаться помочь вам расставлять отступы, поэтому вам, возможно, не придется делать это вручную. Однако, если вы напишете «class» или другое ключевое слово с орфог рафической
Редактирование, компиляция, запуск
31
ошибкой, редактор не распознает его, не подсветит голубым цветом и не вставит правильного отступа. Также, если что-то в вашем коде окажется синтаксически неправильным, редактор подчеркнет это место волнистой линией. Если редактор не распознает то, что вы набрали, как правильную Сопрограмму, он может просто проигнорировать все табуляторы, которые вы вставили! Кроме того, он может попытаться закончить ваш ввод отображением перечня замечаний. На этом этапе вашего обучения, возможно, лучше просто пропустить «мимо ушей» эти указания.
Вы можете скомпилировать программу, выбрав Build Solution либо Build MyVeryFirstProgram в меню Build. Программа сохранит файл MyVeryFirstProgram.cs на диске и скомпилирует его. Если возникнут ошибки компиляции, они будут перечислены в окне, расположенном под редактором. В ошибках будут указан номер строки в файле исходного кода. Дважды щелкнув конкретную ошибку, вы перейдете к соответствующей строке. Некоторые ошибки в действительности оказываются предупреждениями (warnings). Предупреждения указывают на возможную проблему, которая все-таки существует, хотя и не мешает созданию .ЕХЕ-файла.
Для запуска программы выберите Start Without Debugging из меню Debug или нажмите Ctrl+F5. Если какие-либо изменения были внесены в исходный код с тех пор, как программа была скомпилирована в последний раз, вам будет задан вопрос, хотите ли вы скомпилировать программу заново. Таким образом, вы можете использовать этот пунк т меню сразу для компиляции и запуска.
Когда вы запустите программу, появится консольное окно. Оно будет выглядеть как небольшой устаревший компьютерный терминал с белым текстом и черным фоном. В заголовке консольного окна отобразится имя файла вашего проекта. В окне вы увидите надпись:
"Press any key to continue" (Нажмите любую кнопку для продолжения)
что означает, что программа закончила выполнение. MyVeryFirstProgram ничего не показывает на выходе, но мы решим эту проблему в следующей главе. Нажмите любую кнопку для того, чтобы убрать консольное окно.
32	Глава 4
Я предлагал использовать одинаковое название для проекта (которое станет названием .ЕХЕ-файла), файла исходного кода на C# и класса, объявленного в программе. Все эти имена могут различаться. Как правило, проект состоит из нескольких файлов исходного кода, причем каждый должен иметь уникальное имя. Файл кода на C# также может содержать множество объявлений классов.
Visual C# .NET на самом деле объединяет проекты в то, что он называет решениями (solutions). Решение может содержать один или более проектов. (Идея заключается в том, что решение может содержать энного .ЕХЕ-файлов и динамически подключаемых библиотек. Каждый .ЕХЕ-файл и DLL считаются разными проектами в одном решении.) Когда вы создаете проект (как это сделали мы), Visual C# .NET создает также и решение, содержащее один проект. Чтобы закрыть решение в Visual C# .NET, вы можете выбрать Close Solution в меню File. Позже вы можете заново открыть его, используя Open Solution из меню File. (Не открывайте .CS-файл.)
Visual C# .NET может ошеломить начинающих программистов. Если вам захочется чего-нибудь более простого (и бесплатного), вы можете загрузить мою программу Key of C# с моего Web-сайта. (Подробности смотрите в разделе «Прелюдия» этой книги.)
Для создания нового проекта в Key of С#, выберите New Project из меню File. Наберите имя. Если вы оставите элементы в диалоговом окне отмеченными, программа также создаст С#-файл с тем же названием в этом проекте. Вы будете работать в редакторе, подобном Notepad. Программа будет помогать в вам, автоматически добавляя отступы, но она не удалит ни отступы, которая добавила сама, ни введенные вами. Наберите код и нажмите F6, чтобы скомпилировать его. Ошибки компиляции отобразятся в области, расположенной ниже редактора. Нажмите F7 для запуска программы. Еще одна кнопка — F8 позволяет одновременно скомпилировать и запустить программу.
Программы примеров из этой книги также доступны для загрузки с Web-сайта Microsoft Press (http://www.microsoft.com/m<press/books/626Lasp). Вместо того чтобы набирать программы самостоятельно, вы можете п рос то открыть со
Редактирование, компиляция, запуск
33
зданные мной решения» а затем скомпилировать и запустить программы. Но я этого не советую. Практикуйтесь в наборе С#-кода, это очень похоже на выполнение упражнений на пианино.
Какой бы способ вы ни избрали для компиляции ваших программ, вам придется много времени потратить на эксперименты с вашим кодом, пытаясь получить решение на выходе. Экспериментирование — это, возможно, единственная наиболее важная деятельность в изучении языка программирования. Чем замечательно программирование, так это тем, что экспериментирование одновременно легко и безопасно. Это не как в химии. Вы не взорвете свой дом. Например, удалите один из операторов присваивания из программы MyVeryFirstProgram. Посмотрите, что случится» если значение AdultTkts или ChildTktue задано. Приготовьтесь получать сообщения об ошибках от компилятора и учитесь понимать, что они означают. Вы можете также убрать оператор присваивания, который вычисляет значение TotalTkts. Здесь нет ошибки, ио о чем предупреждает вас компилятор?
Попробуйте заменить в программе слово class ключевым словом struct (которое означает структуру). Программа должна работать в точности также. На самом деле существует довольно значительная разница между классами и структурами, и понимание этой разницы во всех фрагментах представляет собой один из важных аспектов программирования на С#, которые вы узнаете из этой книги. Но в остальном class и struct идентичны.
Ехли вы захотите дать .ЕХЕ-файлы ваших Сопрограмм друзьям, им потребуется Microsoft .NET Framework Redistributable, которая поставляется вместе с Visual C# .NET, а также доступна для загрузки с littp://msdn.niicrosoft.corn/down-loads/list/netdevfraruework.asp.
Конечно же, вы не захотите давать кому-нибудь программу, которая не показывает никаких результатов. Исправление этой проблемы станет нашей задачей в следующей главе.
ГЛАВА
Вывод на консоль
Как программист пишущий компьютерные программы, вы должны поддерживать особую связь с призрачной личностью, которая маячит где-то за границами вашего поля зрения. Бедный, озадаченный, раздраженный и злой, этот человек известен ва»м как пользователь. В лучшем случае пользователь полностью уступчив; в худшем случае пользователь — враг, который с сумасшедшим упорством будет давить на клавиши до тех пор, пока ваша программа не «упадет».
На самом раннем этапе разработки вашей программы единственный пользователь вашей программы — вы сами. Так как вы попеременно становитесь то программистом, то пользователем, ваше мнение о программе скачет вслед за вами взад и вперед. Когда ваша программа показывает выходной результат своей работы пользователю, этот результат становится входным для восприятия пользователя. Когда пользователь набирает текст па клавиатуре, текст становится входными данными для программы.
Программы должны иметь способ показывать результаты работы пользователю и получать от него информацию, что называется пользовательским вводом-выводом (user I/O). Ме тоды реализации этого, иногда их еще называют моделями ввода-вывода, различаются в зависимости от назначения программы. Программа, работающая под управлением Windows, получает информацию о действиях пользователя посредством клавиатуры, мыши и различных элеменюв управления, таких, как кнопки и полосы прокрутки. Windows-программы выводят данные н виде текста и графики. Программа, встроенная в микроволновую печь, имеет совершенно иную модель ввода-вывода. Ввод осуществляется кнопками на передней панели, а результатом работы считается включение,
Вывод на консоль
выключение печи, вращение подставки и включение света. Как и С, язык C# не предоставляет сам по себе материал для пользовательского ввода-вывода. Это может показаться недостатком, но на самом деле это не так. Корректнее сказать, что C# не навязывает программисту какой-то конкретной модели ввода-вывода. Вы сами выбираете модель в зависимости от того, для чего предназначается ваша программа.
Для построения наиболее распространенных пользовательских моделей ввода-вывода — Windows, Web или консоли, вы применяете классы и методы, определенные в .NET Framework. Для изучения этих классов запустите программу под Windows, которая открывает доступ к документации .NET Framework. (Эта программа также содержит и документацию на С#.)
Если у вас установлен Visual C# .NET, запустите документацию на Microsoft Visual Studio .NET, щелкнув одноименный пункт в меню Пуск. В левой части окна программы расположена дерево структуры. Раскройте Visual Studio .NET, а затем .NET Framework.
Если же вы используете .NET Framework SDK, запустите документацию, щелкнув Microsoft .NET Framework SDK в подменю Программы меню Пуск. В дереве структуры в левой части окна раскрой те .NET Framework SDK.
Вы также можете получить доступ к документации через Интернет. Откройте http://msdn.microsoft.com/library. Выберите .NET Development, затем .NET Framework SDK, далее .NET Framework и наконец Reference.
Для любого из вышеперечисленных вариантов раскройте пункт Reference, а затем Class Library. Сейчас самое главное — не испугаться появившегося длинного списка. Многие материалы, перечисленные здесь, вам никогда не понадобятся. То, что вам действительно потребуется, —так это список пространств имен (namespace), которые позволяют разделить классы .NET на функциональные группы. Пространство имен, содержащее основные классы и структуры, называется System. Если вы раскроете его, то вы увидите класс консоли (Console Class), а когда раскроете этот класс, то отобразите методы, которые ваша программа может использовать для чтения вводимых в консольные приложения данных и написания выводимых данных. Это как раз то, ч то мы будем здесь
36
Глава 5
использовать. Со временем вам захочегся более внимательно изучить эти методы, сейчас же вам достаточно просто представлять себе, где они документированы.
Давайте начнем с вывода данных; с вводом разберемся позднее, в главе 12. Для отображения данных консольным приложением используются два метода: System.Console. Write (запись в системную консоль) и System.Console. WriteLine (запись строки).
Например, чтобы отобразить значение TotalTkts, вы можете вставить следующий оператор в MyVeryFirstProgram сразу после оператора присваивания TotalTkts:
System. Console. WriteLine(TotalTkts);
Скомпилируйте программу и запустите ее. Вы увидите число
5
показанное в окне консоли, за которым следует уже знакомое нам «Press any key to continue». Программа работает!
Вы также можеге попробовать набрать
System.Console.Write(TotalTkts);
В этом случае вы увидите
"5Press any key to continue”.
Разница заключается в том, что метод System.Console. WriteLine после вывода данных переходит на следу ю-щую сроку, a System.Console.Write этого не делает. Последний метод полезен для вывода на экран большого количества элементов в одной строке.
Как писатели-романисты и коты Т.С. Элиота, каждый метод в .NET Framework имеет три имени. WriteLine это фактическое имя метода. Вы уже немного знаете о том, ч то такое метод, потому что Main является методом. Метод — это набор кода, выполняющий определенную работу. В данном случае работа метода WriteLine заключается в выводе данных программы на консоль.
Console — это класс. Вы уже знаете, что такое класс, так как уже имели дело с классом MyVeryFirstProgram . Точно так же как Main— метод класса MyVeryFirstProgram, WriteLine — метод класса Console.
Вывод на консоль
37
System обозначает пространство имен (namespace). Все классы в .NET Framework организованы в пространства имен, которые подразделяют классы на функциональные группы. Может быть и другое пространство имен, содержащее класс Console, и это нормально.
В «С# Language Specification» такое выражение:
System.Console.WriteLine(TotalTkts);
называется выражением вызова (invocation expression), но большинство программистов на C# сказали бы, что это вызов метода (method call). Программа вызывает метод WriteLine, по существу передавая значение переменной TotalTkts, которая указывается в круглых скобках после названия метода. Говорится, что программа передает переменную TotalTkts методу WriteLine или что переменная TotalTkts является аргументом метода WriteLine.
В главе 3, когда я обсуждал объявление метода Main, я сказал, что у него нет входных параметров. В программе этот факт отражает пара пустых скобок, которые расположены за названием метода Main:
static void Main() 1
Ключевое слово void означает, что Main не возвращает никакого значения.
В исходном коде, который составляет .NET Framework, объявление WriteLine, возможно, выглядит следующим образом:
namespace System
{
public sealed class Console
{
public static void WriteLine(int value)
1
}
1
38	Глава 5
Я говорю возможно, потому что исходный код .NET Framework считается собственностью Microsoft и я никогда его не видел. Этот небольшой фрагмент воображаемого кода также включает несколько новых для вас ключевых слов (namespace, public и sealed), о которых я расскажу детально позже в этой книге. Пространство имен System содержит еще множество классов помимо Console, класс Console также содержит другие методы кроме WriteLine, и я не показал тела метода WriteLine, который собственно и отвечает за вывод числа в консольном приложении.
Единственное, на что я хочу обратить ваше внимание, так это то, что хметод WriteLine объявляется с одним параметром — в круглых скобках вслед за его названием:
public static void WriteLine(int value) {
Программа, использующая метод WriteLine, передает ему аргухМент:
System. Console. WriteLine(TotalTkts);
Когда программа вызывает метод WriteLine, метод принимает значение аргумента TotalTkts. Метод WriteLine в .NET Framework выводит значение переменной (в нашеги случае оно равно значению TotalTkts) на консоль. Когда метод WriteLineзаканчиваег всю работу, говорят, что он возвращает управление обратно вызвавшей его программе, которая затем продолжает свое выполнение.
Я использовал термины параметр и аргумент. Я сказал, что метод WriteLine имеет единственный параметр, называющийся значением. Я также сказал, что, когда программа вызывает метод WriteLine, опа передает методу аргумент, в этом примере это TotalTkts. Очевидно, существует тесная взаимосвязь между параметрами и аргументами — такая тесная, что некоторые программисты даже считают эти два слова взаимозаменяемыми. Но вы должны строго различать их. Разница эта, как ракурс зрения, зависит от того, с какой стороны вы смотрите: изнутри метода или снаружи. Если бы могли оказаться внутри метода WriteLine, вы бы увидели код, выводящий значение параметра на консоль. Но этот код в действи-