You are on page 1of 744

Полный справочник по С#

Герберт Шилдт

Издательский дом "Вильяме"

Москва • Санкт-Петербург • Киев

2004

ББК 32.973.26-018.2.75

Ш57

УДК 681.3.07

Издательский дом "Вильяме"

Зав. редакцией С.Н. Тригуб

Перевод с английского и редакция Н.М. Ручко

"Вильяме" по адресу:

По общим вопросам обращайтесь info@williamspublishing.com, http://www.williamspublishing.com

в Издательский дом

Шилдг, Герберт.

Ш57

Полный справочник по

"Вильяме",

2004. — 752

с.

С#.

:

Пер.

с

англ.

М.

: ил.

Парал. тит.

англ.

ISBN 5-8459-0563-Х (рус.)

: Издательский

дом

В этом полном справочнике по С# — новому языку программирования, раз-

.NET, —

описаны языка: типы данных, операторы, управляющие инструкции, классы, интерфейсы, делегаты, индексаторы, события, указатели и директивы препроцессора. Подроб- но описаны возможности основных библиотек классов С#. Автор справочника — общепризнанный авторитет в области программирова- ния на языках С и C++, Java и С# — включил в книгу полезные советы и сотни примеров с комментариями, которые удовлетворят как начинающих программи- ка-

работанному

специально

для

среды

все

основные

аспекты

и ждый, кто программирует на С#.

опытных

стов, так

специалистов.

Этот

справочник обязан иметь

под рукой

32.973.26-018.2.75

ББК

Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может бы то ни было форме и какими бы то ни было средствами, будь ские, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Osborne Publishing.

быть воспроизведена в какой

то электронные или механиче-

Authorized translation from the English language edition published by McGraw-Hill Companies, Copyright © 2003 All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Russian language edition published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2004

ISBN 5-8459-0563-Х (рус.) ISBN 0-07-213485-2 (англ.)

© Издательский дом "Вильяме", 2004 © by The McGraw-Hill Companies, 2003

Оглавление

 

18

Часть I. Язык С#

21

1.

Создание языка С#

22

2. Обзор элементов языка

С#

30

3. Типы данных, литералы

53

Глава 4. Операторы

80

Глава 5. Инструкции управления

,

102

6.

Введение в классы, объекты и методы

126

7.

154

8. Подробнее о методах и классах

179

Глава Глава 9. Перегрузка операторов

Глава

224

10. Индексаторы и свойства

Глава 11. Наследование

256

277

Глава 12. Интерфейсы, структуры и перечисления

319

Глава 13. Обработка исключительных ситуаций

349

Глава 14. Использование средств ввода-вывода

Глава

375

15. Делегаты и события

Глава 16. Пространства имен, препроцессор и компоновочные файлы

409

431

Глава 17. Динамическая идентификация типов, отражение и атрибуты

449

18. Опасный код, указатели и другие

484

Часть II. Библиотека С#

501

Глава 19. Пространство имен System

Глава

502

Глава 20. Строки и форматирование

541

Глава 21. Многопоточное программирование

575

22. Работа с коллекциями

Глава 23. Сетевые возможности и использование Internet

610

645

Часть III. Применение языка С #

669

Глава 24. Создание компонентов

670

Глава 25. Создание Windows-приложений

689

Глава 26. Синтаксический анализ методом рекурсивного спуска

707

Часть IV. Приложения

731

"

 

732

737

740

Содержание

 

17

18

Часть I. Язык С#

 

21

 

1. Создание языка

С#

22

Генеалогическое дерево С#

 

23

 

Язык С, или начало современной эпохи программирования

23

Создание

ООП и C++

языка Java

24

Internet и появление

25

Создание С#

26

Связь С# с оболочкой .NET Framework

 

27

.NET Framework

27

28

28

29

Глава 2. Обзор элементов языка С#

30

 

31

32

32

33

33

Первая простая программа Использование компилятора командной строки csc.exe

 

34

 

34

34

35

 

Выполнение программы Использование Visual Studio IDE

35

"Разбор полетов", или первый пример программы "под микроскопом"

38

 

40

41

42

44

45

Первое знакомство с инструкциями управления Инструкция if

 

45

Цикл for

47

 

48

50

50

Использование отступов Ключевые слова С#

 

51

 

51

Идентификаторы Библиотеки классов С#

 

52

 

3. Типы данных, литералы

53

 

54

 

в С#

54

 

55

57

Типы для представления Тип decimal

 

58

   

61

62

65

65

66

66

68

68

69

70

72

73

74

76

78

Глава 4. Операторы

 

80

 

81

   

82

84

87

89

89

90

90

96

99

99

101

101

Глава 5. Инструкции управления

 

102

Инструкция if

 

103

Вложенные if-инструкции

104

Конструкция if-else-if

105

Инструкция switch

106

Вложенные инструкции switch

110

Цикл for

110

Вариации на тему цикла for

112

 

112

114

115

116

116

Циклы без тела Объявление управляющей переменной в цикле for

 

117

Цикл while

117

Цикл do-while

119

Цикл foreach

120

Использование инструкции break для выхода из цикла

120

Использование инструкции continue

122

Инструкция return

123

Инструкция goto

123

 

126

127

 

127

   

128

132

133

134

Building

134

137

138

140

Использование параметров Добавление параметризованного метода в класс Building

 

142

 

144

144

146

Параметризованные конструкторы Добавление конструктора в класс Building

 

146

Использование оператора new

147

Применение оператора new к переменным типа значений

148

Сбор "мусора" и использование деструкторов

149

 

149

Деструкторы Ключевое слово this

151

Глава 7. Массивы и строки

154

155

   

155

157

158

159

159

160

 

161

162

164

Присвоение значений ссылочным переменным массивов Использование свойства Length

 

165

Использование свойства Length при работе с рваными массивами

\

167

Цикл foreach

168

 

.

172

 

172

173

175

Постоянство строк

 

177

Использование строк в switch-инструкциях

t

178

Глава 8. Подробнее о методах и классах

*

179

класса Спецификаторы доступа С#

 

180

180

Применение спецификаторов доступа public

и private

182

   

182

187

189

191

191

193

195

197

199

 

202

Вызов перегруженного

с помощью ссылки this

203

208

Метод Main()

212

213

Возвращение значений из метода Main()

213

Передача аргументов методу Main()

213

215

218

223

Глава 9. Перегрузка операторов

224

225

"

226

228

232

236

237

240

~240

242

246

250

251

10. Индексаторы и свойства

256

257

257

260

263

264

266

271

271

Глава 11. Наследование

277

278

281

283

285

286

290

слова base для доступа к скрытому

291

293

296

297

301

305

305

309

Использование абстрактных классов Использование ключевого слова sealed для предотвращения наследования

313

Класс object

313

315

Приведение к объектному типу и восстановление значения Использование класса object в качестве обобщенного типа данных

317

Глава 12. Интерфейсы, структуры и перечисления

319

 

320

321

325

327

328

330

331

331

332

333

334

334

335

340

343

345

347

347

347

Глава 13. Обработка исключительных ситуаций

349

350

350

351

351

353

354

356

357

358

358

360

360

Использование блока

finally

362

Исключения "под микроскопом 4 '

363

365

367

370

Перехват исключений производных классов Использование ключевых слов checked и unchecked

372

Глава 14. Использование средств ввода-вывода

375

376

376

 

376

377

377

378

378

380

380

380

382

Запись данных в консольный входный Класс FileStream и файловый ввод-вывод

383

Как открыть

и закрыть файл

383

в файл

385

Использование класса FileStream

386

387

389

389

391

392

394

394

395

396

400

402

404

405

15. Делегаты и события

409

410

413

методами,

415

416

416

418

419

421

425

.NET Framework

событий Использование встроенного делегата EventHandler

426

428

Учебный проект: использование событий

429

Глава 16. Пространства имен, препроцессор и компоновочные файлы

431

432

432

434

Пространства имен предотвращают Ключевое слово using

436

Вторая форма использования директивы using

437

438

440

441

441

Препроцессор #define

442

#if и #endif

442

#else

и #elif

444

#undef

445

#error

446

#warning

446

#line

446

#region и #endregion

447

Компоновочные файлы и модификатор доступа internal

447

Модификатор доступа internal

447

Глава 17. Динамическая идентификация типов, отражение и атрибуты

449

450

 

is

450

ключевого Использование оператора as

451

Использование оператора typeof

 

453

454

Отражение Ядро подсистемы отображения: класс System.Type

 

454

 

455

455

Получение информации о методах Второй формат вызова метода GetMethods()

 

458

 

459

462

466

471

474

474

474

475

475

477

480

Использование встроенных атрибутов Атрибут AttributeUsage

480

Атрибут Conditional

481

Атрибут Obsolete

482

18. Опасный

код, указатели и другие

484

485

486

486

Объявление указателя "*" и "&"

Операторы Использование ключевого слова unsafe

487

487

Использование модификатора fixed

488

489

489

491

492

492

494

494

495

496

Ключевые слова смешанного типа sizeof

496

lock

496

readonly

496

stackalloc

497

Инструкция using

498

Модификаторы const и volatile

499

Часть II. Библиотека С#

501

Глава 19. Пространство имен System

502

имен System

 

503

504

509

510

511

Decimal

514

Структура Char

518

Boolean

523

Класс Array

523

524

памятью

GC

Random

 

526

527

532

Класс Object

534

536

537

Интерфейс IComparable

537

Интерфейс IConvertible

538

Интерфейс ICloneable

538

Интерфейсы IFormatProvider и IFormattable

540

Глава 20. Строки и форматирование

541

в С#

542

String

 

542

543

543

544

544

544

547

549

552

555

556

557

558

558

 

559

560

String. Format()

и ToString()

561

562

564

565

565

   

569

571

573

Глава 21. Многопоточное программирование

575

576

   

577

577

580

581

583

585

586

588

 

592

593

Класс Monitor

и инструкция lock

Pulse() и PulseAll()

594

методов Wait(),

594

595

598

Использование атрибута MethodlmplAttribute

599

Приостановка, возобновление и завершение выполнения потоков

601

формат использования метода Abort()

603

604

606

606

608

608

Глава 22. Работа

610

611

612

Интерфейсы коллекций Интерфейс ICollection

Интерфейсы IEnumerable, I Enumerator и I Dictionary Enumerator

612

Интерфейс IList

613

Интерфейс I Dictionary

614

615

Интерфейс IComparer

615

Интерфейс IHashCodeProvider

616

Dictionary Entry

616

616

Класс Array List

617

Сортировка Array List-массивов и выполнение поиска

621

622

Создание обычного массива из динамического Класс Hashtable

623

Класс SortedList

625

Класс Stack

629

Класс Queue

631

BitArray

633

636

636

637

638

639

641

642

644

Глава 23. Сетевые возможности и использование Internet

645

Члены пространства имен System.Net

646

647

Универсальные идентификаторы ресурсов Основы Internet-доступа

647

Класс WebRequest

648

Класс WebResponse

650

Классы HttpWebRequest

и HttpWebResponse

650

650

653

Обработка сетевых ошибок Исключения, генерируемые методом Create()

653

Исключения, генерируемые методом GetReponse()

654

Исключения, генерируемые методом GetResponseStream()

 

654

 

654

Обработка исключений Класс UR1

656

Доступ к дополнительной HTTP-информации

657

658

Доступ к заголовку Доступ к cookie-данным

659

Использование свойства LastModified

660

Учебный проект: программа MiniCrawler

661

Использование класса WebClient

665

Часть III. Применение языка С#

"

669

Глава 24. Создание компонентов

670

671

671

Компонентная модель Что представляет собой С#-компонент

672

672

Контейнеры и узлы Сравнение С#- и СОМ-компонентов

»

672

Интерфейс IComponent

673

Класс Component

 

673

674

Простой компонент Компиляция компонента CipherLib

 

675

Клиент, использующий компонент CipherComp

676

Переопределение метода Dispose()

677

Демонстрация использования метода Dispose(bool)

678

 

683

Защита освобожденного компонента от использования Использование инструкции using

 

684

 

685

686

Использование контейнера Компоненты — это будущее программирования

688

Глава 25. Создание Windows-приложений

689

Краткий экскурс в историю Windows-программирования

 

690

Windows-приложений,

 

691

окон Как Windows взаимодействует

691

Windows-формы

692

Класс Form

692

Схематичная Windows-программа,

692

Компиляция первой Windows-программы

694

694

Компиляция из командной строки Компиляция в интегрированной среде разработки (IDE)

 

695

 

695

   

696

696

696

 

697

699

700

702

706

Глава 26. Синтаксический анализ методом рекурсивного спуска

 

707

 

708

Выражения Анализ выражений: постановка задачи

709

 

710

711

713

719

720

 

728

728

Часть IV. Приложения

731

Приложение А. Краткий обзор языка комментариев XML

732

Теги языка комментариев XML

733

Компиляция XML-документа

734

Пример XML-документа

734

737

740

Об авторе

Шилдт (Herbert Schildt) — всемирно известный автор книг по программи-

Герберт рованию и крупный специалист в области таких языков, как С, C++, Java и С#. Про-

дано свыше 3 миллионов экземпляров его книг. Они переведены на множество язы- ков. Шилдт — автор

C++, C++: A

таких бестселлеров, как Полный справочник по С, Полный справоч- Beginner's Guide, C++from the Ground Up, Java 2: A Beginner's Guide

ник и Windows 2000 Programming from the Ground Up. Шилдт — обладатель степени магистра

по

в области вычислительной техники (университет шт. Иллинойс). Телефон его кон- сультационного отдела: (217) 586-4683.

Введение

чего-то ищем способы повышения быстродействия программ, их эффективности и переноси- мости. Зачастую мы требуем слишком многого от инструментов, с которыми работа- ем, особенно, когда это касается языков программирования. Хотя таких языков суще- них

которым всегда

мы

без

конца

из фективность языка заключается в его мощности и одновременно — в гибкости.

ствует великое

Синтаксис языка должен быть лаконичным, но ясным. Он должен способствовать ультрамод-

созданию корректного кода

и предоставлять реальные

возможности, а не

ные (и, как правило, тупиковые) решения. Наконец, мощный язык должен иметь од- Как

но нематериальное качество: вызывать программирования и является С#.

ощущение гармонии.

раз

таким языком

Созданный компанией Microsoft опирается на богатое ром

был

ведущий

специалист

этой

.NET Framework, язык С# архитекто-

Hejlsberg).

для поддержки

среды

наследие в области программирования. Его главным

в

области — Андерс

Хейлсберг

(Anders

множество, но только некоторые

по-настоящему сильны. Эф-

Программисты — такие люди,

не хватает:

С# -— прямой потомок двух самых успешных в мире компьютерных языков: С и C++. унаследовал

синтаксис, ключевые слова и операторы. Он позволяет постро-

От

С

он

C++. Кроме того, С# Имея общее

в

ить и усовершенствовать другим

объектную очень успешным языком: Java.

модель, определенную

происхождение, но различаясь во многих важных аспектах, С# и Java — это скорее "двоюродные бра- тья". Например, они оба поддерживают программирование распределенных систем и оба используют промежуточный код для достижения переносимости, но различаются при этом в деталях реализации.

близко

связан

с

Опираясь на мощный фундамент, который составляют унаследованные характери- стики, С# содержит ряд важных новшеств, поднимающих искусство программирова-

 

ступень.

Например, в состав

элементов языка С# включены такие по-

нятия,

делегаты (представители), свойства, индексаторы и события. Добавлен атрибуты; упрощено создание компонентов

также синтаксис, который поддерживает за счет исключения проблем, связанных с COM (Component Object Model — модель

компонентных объектов Microsoft — стандартный механизм, включающий интерфей-

сы, с помощью которых объекты предоставляют свои службы другим объектам).

И еще.

Подобно Java язык С# предлагает

средства динамического обнаружения оши-

бок, обеспечения безопасности и управляемого выполнения программ. Но, в отличие от Java, C# дает программистам доступ к указателям. Таким образом, С# сочетает

мощь C++ с типовой безопасностью Java, которая обеспечивается

первозданную

на-

(type

checking)

механизма шаблонных классов (template class). Более того, язык С# отличается тем, что компро-

личием

контроля

типов

и

корректным

использованием

мисс между мощью и надежностью тщательно сбалансирован и практически прозра- чен (не заметен для пользователя или программы). На протяжении всей истории развития вычислительной техники эволюция языков программирования означала изменение вычислительной среды, способа мышления С# не является исклю- чением. В непрекращающемся процессе усовершенствования, адаптации и внедрения нововведений С# в настоящее время находится на переднем крае. Это — язык, игно- рировать существование которого не может ни один профессиональный программист.

программистов и самого подхода к программированию. Язык

Структура книги

С# труднее

При Сам по себе язык С# очень большой, а библиотека

изложении материала

о языке

всего заставить

себя поставить

классов С# еще больше. материала,

книга была

точ-

Чтобы

раз-

ку.

облегчить читателю части. I, Язык С#. II, Библиотека языка С#.

делена

на три

Часть

Часть

овладение таким огромным объемом

Часть III, Применение языка С#.

I содержит

Часть книги, в которой в

определенные

исчерпывающее описаны ключевые также

языке, а

самом

С#. Это слова, синтаксис и средства организация ввода-вывода

описание языка

самая

большая

часть

программирования,

данных,

обработка

файлов и директивы препроцессора.

II исследуются

С#. Одной

классов ляющих является библиотека классов среды .NET Framework.

В

части

возможности

библиотеки

своими размерами. Поскольку ограниченный объем

из

состав-

ее

поражает

биб-

просто книги не позволяет

Она

лиотеку классов среды .NET Framework полностью, в части

охватить II акцент делается

на кор-

невой библиотеке, относящейся к пространству имен System.

С#. Кроме

того,

часть здесь описаны коллекции, орга-

Именно эта

биб-

связана низация многопоточной обработки и сетевые возможности. Эти разделы библиотеки

лиотеки особым

образом

с

будет использовать практически каждый, кто программирует на С#.

цесс разработки

применения С#. В главе

24

компонентов,

в

25

Forms.

приложений с использованием библиотеки Windows

рекурсивного спуска (recursive descent parser).

26

Windows-

Книга для всех программистов

Для вы знакомы с C++ или Java, то с освоением

С# много

стом,

с этими языками.

но

С#,

примерах, приведенных в каждой главе.

Программное обеспечение

из этой книги, необходимо

уста- позднюю версию), а

Чтобы скомпилировать и выполнить программы

пакет Visual

новить на своем компьютере также оболочку .NET Framework.

Studio .Net 7 (или более

Программный код - из Web-пространства

Исходный код всех программ, приведенных с адресом: www.osborne.com.

в

книге, можно

загрузить

с Web-сайта

Что еще почитать

Полный справочник по С# —

"ключ"

Книга нию, написанных Гербертом представлять для вас интерес. Новичкам в программировании на С# стоит обратиться

это

к серии

Шилдтом. Ниже перечислены

книг по программирова- те из них,

к книге

которые

могут

 

С#: A Beginner's Guide.

Тем, кто желает

 

подробнее изучить язык C++, будут интересны следующие книги:

 

C++: Л Beginner's Guide

Полный справочник по C++

Teach Yourself C++

 

C++from the Ground Up

 

STL Programming from the Ground Up

The C/C++ Programming Annotated Archives

Тем, кто интересуется книги:

программированием на языке Java, мы рекомендуем

Java 2: Л Beginner's Guide

Полный справочник по Java

Java 2: Programmer's Reference

такие

Если ных языков программирования, обратитесь к книгам

вы интересуетесь

языком С, который является фундаментом

Полный справочник по С Teach Yourself С

всех

современ-

ILJ ОТ издательства

Вы, читатель

знать, что

там.

знать, нравится

ординаты:

нами.

на них.

о том,

и ее авторов,

мнением и обя-

книг.

E-mail

info@williamspublishing.com

WWW

http://www.williamspublishing.com

Информация для писем из:

 

115419, Москва, а/я 783

Украины 1

03150, Киев, а/я 152

Полный справочник по

Язык С#

В части I описаны элементы языка С#. ключевые слова, синтаксис и операторы. Кроме того, здесь рассмотрены основные инструменты программирования С# (например, способы организации ввода-вывода и средства получения информации о типе), которые тесно связаны с языком С#.

Полный

справочник по

Создание языка С#

С# — это очередная ступень бесконечной эволюции языков программиро- вания. Его создание вызвано процессом усовершенствования и адаптации, ко- торый определял разработку компьютерных языков в течение последних лет. Подобно всем успешным языкам, которые увидели свет раньше, С# опирается на прошлые достижения постоянно развивающегося искусства программирования.

зык

Я

С# (созданном

компанией Microsoft

.NET Frame-

В work) проверенные временем средства усовершенствованы

языке

для поддержки

среды

совре- менных технологий. С# предоставляет очень удобный и эффективный способ написа-

с

помощью

самых

ния программ для современной среды вычислительной обработки данных, которая включает операционную систему Windows, Internet, компоненты и пр. В процессе становления язык С# переопределил весь "ландшафт" программирования.

Назначение

главы — рассмотреть создания и конструктивные

этой

С# в исторической среде, исследовать степень

особенности, а также

тивы других языков программирования. Описана связь С# со средой .NET Framework.

его

влияния на

мо-

него

Генеалогическое дерево С#

языки существуют

новый

язык

в

той

"перекрестного

Компьютерные

чем

на

каждый

в вакууме. или иной форме опыления" средства

не

с другом,

при- влияют его предшественники. В одного

связаны друг

Они

процессе такого

из

языка

контекст, а отжившая и

адаптируются

кон-

другим, удачная новинка интегрируется в существующий за

струкция

отбрасывается

ненадобностью.

Примерно так

происходит

эволюция

компьютерных языков и развитие искусства программирования. Не избежал подобной участи и С#. Языку С# "досталось"

богатое наследство. Он — прямой потомок двух самых ус- пешных языков программирования Java. менее этих взаимосвязей
богатое наследство.
Он —
прямой
потомок двух
самых
ус-
пешных языков программирования
Java.
менее
этих взаимосвязей крайне важно для
начнем с рассмотрения исторической
и
C++) и
тесно
связан
с
не
успешным
языком
Понимание природы
понимания
С#.
Поэтому
знакомство
с
С# мы
среды
этих
трех языков.

Язык С, или начало современной эпохи программирования

С.

созданием языка

Начало современной эпохи программирования отмечено

Он был разработан Дэнисом Ритчи (Dennis Ritchie) в 1970-х годах для компьютера PDP-

11 компании DEC (Digital

Equipment Corporation), в котором

использовалась опера-

ционная система UNIX. Несмотря на то что некоторые известные языки программи-

Pascal, достигли

рования, в особенности

тому признания, именно язык С определил направление сегодняшнего программирования.

значительного развития и

к

времени

1960-х годов

Язык ного перехода к структурному программированию. До структурного

программирования многие программисты испытывали трудности при написании больших программ, по-

скольку называемого "спагетти-кода"

(spaghetti

code)

сивным использованием оператора перехода goto. Такие программы были весьма

и модификаций. В структурных

трудны проблема решалась посредством добавления точно определенных управляющих кон-

для изучения

языках программирования эта

струкций, вызова подпрограмм с локальными переменными и других усовершенство- программы

ваний. Структурные лемые сроки.

в прием-

языки позволили писать довольно большие

Хотя

в

то

котором

в

время

ком,

уже

удачно

языки, С был

существовали мощь, элегантность, гибкость и выразительность.

другие структурные

сочетались

первым язы-

Его лаконичный и к тому же простой в применении синтаксис в совокупности (а

лософией, подразумевающей язык), быстро завоевал

множество

возложение ответственности сторонников. С точки

на программиста

с фи-

на зрения сегодняшнего дня,

не

этот язык, возможно, несколько трудноват для понимания, но программистам ветра,

ждали.

которого языком программирования 1980-х

невозможность справиться с большими программами.

ленного размера, то дальнейшая

ленными трудностями.

и "точки

насыщения" зависело от кон-

Местоположение кретной программы, программиста и используемых

средств,

достижения очень возрастала, 5 000.

Создание ООП и C++

1970-х размер

К

концу

проектов стал

"опускали

шении которого методика ки". решить эту проблему. граммирования (ООП). Используя ООП, программист мог справляться с программами гораздо большего размера, чем прежде. Но вся беда состояла в том, что С, самый по- пулярный на то время язык, не поддерживал ООП. Желание работать с объектно- ориентированной версией языка С в конце концов и привело к созданию C++.

Поэтому стали

структурного

появляться новые подходы

и

язык

С

ру-

к программированию,

позволяющие

к критическому, программирования

приближаться

при

превы-

Один из них получил название объектно-ориентированного про-

Язык

C++ был разработан

Бьярни Страуструпом

(Bjarne

Stroustrup)

в компании

Bell

Laboratories

(Муррей

Первоначально создатель

Нью-Джерси), нового языка

Хил,

назвал

и

его

годом

создания

с классами",

считается

1979-й.

но

в

1983

году

это

имя было изменено на C++. C++ полностью включает элементы языка С. Таким об-

построен C++. Большинство до- объект-

разом,

С полнений, которые Страуструп

можно считать фундаментом, на котором

в С, были

внес но-ориентированного программирования. По сути, C++ — это объектно-

предназначены для поддержки

ориентированная версия языка С. Возводя "здание" C++ на фундаменте

С, Страуст-

совершенно новый язык, С-программисту средства,

лишь ориентированной методики. 1980-х годов

ООП. Вместо не-

ный характер,

к языком программирования.

он язык C++ по-прежнему

1990-х уже

 

превосходство при разработке высокопроизводительных программ системного уровня.

Важно понимать, что создание вый язык программирования. Это очень успешного языка. Такой

вующий язык и поднять его на рая продолжает жить и сегодня.

C++ не

было

попыткой изобрести

совершенно но-

было

своего

рода

языков ступень развития) дал

к разработке

усовершенствование и без того (взять

сущест- начало тенденции, кото-

основу

за

подход

новую

Internet и появление языка Java

 

Java, который первоначально назывался Oak (в переводе

с англ.

"дуб").

входили

1991 году

Java

компании Sun

Microsystems.

Гослинг (James Gosling).

его

(Ed

Патрик Нотон (Patrick Naughton), Крис Уортс (Chris Warth),

Frank) и Майк Шеридан (Mike Sheridan).

Java — это структурный объектно-ориентированный язык программирования, син- таксис и основополагающие принципы которого "родом" из C++. Своими новатор- Java

скими аспектами

(хотя

искусстве и это имело место), сколько изменениям в компьютерной

обязан

не

столько

прогрессу

в

программирования

наступ- ления эры Internet большинство программ писалось, компилировалось и предназнача-

Еще до

среде.

процессора

и под

управлением

лось для выполнения с использованием определенного

конкретной операционной системы. Несмотря на то лись делать свои программы так, чтобы

что программисты всегда

стара-

применять неоднократно,

их

можно

было

возможность легко переносить программу из одной среды в другую не была еще дос- тигнута, к тому же проблема переносимости постоянно отодвигалась, решались же Internet, в которой оказались связанными различные типы процессоров и операционных систем, старая проблема переносимости заявила о себе уже в полный голос. Для бился новый язык программирования, и им стал Java.

более насущные проблемы.

Однако с появлением

всемирной сети

ее решения понадо-

аспектом Java

важным причиной быстрого признания) является возможность создавать на нем межплатфор-

Интересно отметить,

что, хотя единственным наиболее

менный (совместимый с несколькими операционными средами) переносимый про-

импульсом для возникновения Java стала

Internet, a

сеть настоятельная потребность в не зависящем от платформы языке, который можно бы- ло бы использовать в процессе создания программного обеспечения для встроенных контроллеров. В 1993 году стало очевидным, что проблемы межплатформенной пере- носимости, четко проявившиеся при создании кода для встроенных контроллеров,

не

граммный код, исходным

Internet. Ведь

при Internet — это безбрежная компьютерная среда, в которой "обитает"

также

оказались

весьма

актуальными

попытке написать

код

для

множество ком- пьютеров различных типов. И оказалось, что одни и те же методы решения проблемы переносимости в малых масштабах можно успешно применить и к гораздо большим, т.е. в Internet.

Java

преобразования программы в промежуточный код, именуемый байт-кодом (bytecode), т.е. машинно-

В

переносимость

достигается

посредством

исходного

кода

независимый код, генерируемый Java-компилятором.

Байт-код

выполняется

вирту-

альной машиной Java (Java Virtual Machine — JVM) -— специальной операционной

системой. Следовательно, Java-программа

дос- тупна JVM. А поскольку JVM относительно проста для реализации, она быстро стала

могла

бы

работать

в

любой

среде, где

доступной для большого количества сред. Использование Java-программами

С- программ, которые почти всегда компилировались для получения исполняемого ма- шинного кода. Машинный код связан с конкретным процессором и операционной системой. Поэтому, если С/С++-программу нужно выполнить в другой системе, ее необходимо перекомпилировать в машинный код, соответствующий этой среде. Сле- довательно, чтобы создать С/С++-программу, предназначенную для выполнения в различных средах, необходимо иметь несколько различных исполняемых (машинных) версий этой программы. Это было непрактично и дорого. И наоборот, использование для выполнения Java-программ промежуточного языка было элегантным и рентабель- ным решением. Именно это решение было адаптировано для языка С#.

байт-кода радикально отличало

их от

и С++-

Java — потомок

C++. Его

уже таксисе С, а объектная модель — продукт эволюции объектной модели C++. Хотя

упоминалось,

C++ ни снизу

вверх, C/C++-программистов могли

вниз, его

С,

на Java.

Более того,

 

Java строился на существующей

(и усовершенствовал

ее), Джеймсу

C++,

"изобретать

колесо"

нужно Java не было необходимости

этого языка.

шенно новый язык программирования. Более того, создание Java показало, что языки С и C++ — прекрасный "субстрат" для "выращивания" новых компьютерных языков.

Создание С#

Разработчики Java успешно решили многие проблемы, связанные с переносимо-

Internet, но далеко взаимодействия (cross-language

стью

в

среде

все. Одна

не

interoperability)

из них — межъязыковая программных

и

возможность

аппаратных

изделий

поставщиков,

разных

или многоязыковое программирование (mixed-language

program-

ming).

могли

В бы успешно работать

случае

решения этой проблемы

одна

программы, написанные на разных Такое взаимодействие необходимо для соз- (ПО), а

языках,

с другой.

также для программирования компонентов ПО, поскольку самым ценным является компо-

дания больших систем с распределенным программным обеспечением

нент, который можно операционных сред. в Java

Кроме того,

использовать

не достигнута

в

широком диапазоне

компьютерных

языков

и

полная интеграция с платформой Windows. Хотя

Java-программы

могут выполняться

в

среде

Windows

(при условии

установки

вирту-

машины Java), Java и Windows не являются прочно связанными средами. А по-

альной скольку Windows — это наиболее широко используемая операционная система в мире,

то отсутствие прямой поддержки Windows — серьезный недостаток Java.

эти потребности, Microsoft

и стал

частью

С#. С# был соз- Microsoft.

язык

Чтобы удовлетворить 1990-х годов

в конце

свет

в качестве

разработала общей .NET-стратегии

дан

увидел

2000 года.

а-версии (Anders Hejlsberg) — один из ведущих

в середине

Впервые он Главным архитектором С# был язы-

области ков программирования, получивший признание во всем мире. Достаточно сказать, что

Андерс Хейлсберг

специалистов в

в

1980-х

он

был

автором

весьма успешного

продукта

Turbo

Pascal, изящная реализа-

ция которого установила стандарт для всех будущих компиляторов.

С,

не случайно.

языка —

языки программирования в мире.

C++, и

Более того,

знает Java.

Поскольку С# построен на прочном, понятном фундаменте, то переход

 

"фундаментальных"

к "надстройке"

программистов.

"колесо", он сосредоточился на введении усовершенствований и новшеств.

 

Генеалогическое дерево С# показано на рис. 1.1. "Дедушкой"

С# унаследовал

синтаксис, многие ключевые

С# является язык

С.

и операторы. Кроме

язык того, С# построен на улучшенной или C++, то с С# вы сразу

слова модели, определенной друзьями.

C++. Если

 

С#

Java

собой несколько сложнее. Как упоминалось выше, Java

C++. У

объектная модель.

Подобно Java C# предназначен для создания переносимого

потомок Java.

кода.

С# — не ями, имеющими

предков,

"генов". Если вы знаете язык Java, то вам придется вам будут И Java, то, познакомившись с
"генов".
Если
вы
знаете
язык Java, то
вам придется
вам
будут
И
Java, то, познакомившись с С#, вам
знакомы многие
понятия С#.
на-
оборот,
если
придется осваивать многие средства Java.
в
будущем
изучать
не

C++

Java

С#

Рис. 1.1. Генеалогическое дерево С#

С#

средств, важные из них связаны со встроенной поддержкой программных компонентов. Именно наличие встроенных средств написания программных компонентов и позво- лило С# называться компонентно-ориентированным языком. Например, С# включает средства, которые напрямую поддерживают составные части компонентов: свойства, и события. Все же самым важным качеством компонентно-ориентированного

содержит

множество

новых

которые

описаны

в

этой

Самые

методы языка является его способность работать в среде многоязыкового профаммирования.

книге.

Связь С# с оболочкой .NET Framework

что взаимоотношения со средой .NET Framework. Несмотря на то С# — самодостаточный компьютерный язык, у И
что
взаимоотношения со средой .NET Framework.
Несмотря на
то
С# — самодостаточный
компьютерный язык, у
И на это есть две
него
особые
Во-первых,
С# изначально разработан компанией Microsoft для создания кода, выполняющегося в
причины.
среде
.NET Framework.
Во-вторых,
в
этой
среде
определены
библиотеки,
используе-
мые
языком
С#. И хотя
очень важно
можно отделить
С# от .NET Framework,
среды
о .NET Framework
эти две
тесно
связаны, поэтому
общее
столь важна для С#.
иметь
представление
и
по-
нимать, почему
эта среда

О среде .NET Framework

.NET Framework определяет среду для разработки и выполнения сильно

Оболочка распределенных приложений, основанных на использовании компонентных объектов. Она позволяет "мирно сосуществовать" различным языкам профаммирования и обеспечивает безопасность, переносимость программ и общую модель профаммиро- вания для платформы Windows. Важно при этом понимать, что .NET Framework no своему существу не офаничена применением в Windows, т.е. профаммы, написанные для нее, можно затем переносить в среды, отличные от Windows.

.NET

Framework

С#

Связь

важных Одно из них, Common Language Runtime (CLR), представляет собой систему,

среды

с

обусловлена

наличием

двух

очень

средств. которая управляет выполнением пользовательских профамм. CLR — это составная

часть .NET Framework, которая делает профаммы переносимыми, поддерживает многоязыковое профаммирование и обеспечивает безопасность.

Второе средство, библиотека классов .NET-оболочки, предоставляет программам доступ к среде выполнения. Например, если вам нужно выполнить операцию ввода- использо- вать .NET-библиотеку классов. Если вы — новичок в программировании, термин класс вам может быть незнаком. Ниже вы найдете подробное объяснение этого поня- тия, а пока ограничимся кратким его определением: класс — это объектно- ориентированная конструкция, с помощью которой организуются программы. Если программа ограничивается использованием средств, определенных .NET-библиотекой

вывода, скажем, отобразить

что-либо

на

экране, то

для

этого необходимо

(т.е. в любой

среде), где

поддерживается .NET-

выполняться система. Поскольку С# автоматически использует .NET-библиотеку классов, С#-

везде

классов, она может

программы автоматически переносимы во все .NET-среды.

-J Функционирование системы CLR

Система CLR управляет

выполнением .NET-кода. Вот как это происходит. В ре-

зультате компиляции Сопрограммы получается рый содержит

не исполняемый код, а файл, кото-

промежуточным языком Microsoft

специальный псевдокод, именуемый

(Microsoft Intermediate Language — MSIL). MSIL определяет набор переносимых инст-

 

рукций, которые

мость ассемблера.

MSIL определяет переноси-

Java, это не одно и

процессора. MSIL подобен байт-коду

По сути,

то же.

Цель CLR-системы — при выполнении программы перевести ее MSIL-компиляции,

исполняемый.

образом,

программа,

 

среде, для которой реализована

CLR-система.

.NET Framework

частично программ. Код, написанный на промежуточном языке Microsoft,

и

состоит

способность

среды

добиваться

переносимости

переводится в исполняемый с помощью ЛТ-компилятора. "ЛТ" — сокр. от выражения "yust-/n-rime",

означающего

выполнение точно к нужному моменту (так обозначается стратегия принятия реше- ний в самый последний подходящий для этого момент в целях обеспечения их мак-

симальной точности). Этот процесс работает

.NET-программы

CLR-система

MSIL-код

"родной"

образом. ЛТ-компилятор, который

активизирует основе, поскольку необходимо

каждую часть программы. Таким образом, Сопрограмма в действительности

"родного"

няется лирована в MSIL-код. Это значит, что программа будет выполнена практически так

кода,

то,

быстро,

она "родного" кода, но с "добавлением"

в MSIL-код.

 
 

компиляции Сопрограммы помимо MSIL-кода образуются и мета-

данные (metadata). Они описывают данные, используемые коду взаимодействовать

программой, и позволяют же

в том

файле, где

с другим кодом. Метаданные содержатся

хранится MSIL-код.

  • I Сравнение управляемого кода с неуправляемым

общем ляемым (managed code). Управляемый

В

системы.

У такого

К

случае при написании Сопрограммы

код

выполнения в результате числу

и немалые достоинства.

ограничений относится

создается код, называемый управ- выполняется под управлением CLR- как определенные ограничения, так необходимость

есть

иметь, во-

первых, специальный компилятор, который должен создавать MSIL-файл, предназна- ченный для работы под управлением CLR-системы, и, во-вторых, этот компилятор должен использовать библиотеки среды .NET Framework. Достоинства же управляе- возможность использовать различные языки, улучшенная безопасность, поддержка управления версиями и чет- кая организация взаимодействия программных компонентов.

мого кода — современные методы управления памятью,

кодом? Все Windows-программы до созда-

Что же ния среды .NET Framework использовали неуправляемый код, который не выполняет- ся CLR-системой. Управляемый и неуправляемый код могут работать вместе, поэтому факт создания С#-компилятором управляемого кода отнюдь не ограничивает его воз- можность выполняться совместно с ранее созданными программами.

понимается под неуправляемым

Спецификация универсального языка

код обладает достоинствами,

предоставляемыми CLR-системой, но если он используется другими программами, написанными на иных языках, то для достижения максимального удобства и простоты использования он должен соответствовать спецификации универсального языка (Common Language Specification — CLS). Эта спецификация описывает набор свойств, которыми одно- временно должны обладать различные языки. Соответствие CLS-спецификации осо- бенно важно при создании программных компонентов, которые предназначены для использования программами, написанными на других языках. CLS-спецификация включает подмножество системы поддержки общих типов (Common Type System — CTS). CTS-система определяет правила в отношении типов данных. Безусловно, С# поддерживает как CLS-, так и CTS-спецификации.

Несмотря

на

то

что

управляемый

Полный справочник по

Обзор элементов языка С#

амым трудным что ни один языка работают в изучении языка программирования, безусловно, является то, его элемент
амым трудным
что ни один
языка работают
в изучении языка программирования, безусловно, является то,
его
элемент не существует изолированно от других. Компоненты
вместе,
мосвязь усложняет рассмотрение одного аспекта С# без рассмотрения других. Зачас-
можно сказать,
в дружном
"коллективе". Такая тесная взаи-

тую обсуждение

одного средства предусматривает гим. Для преодоления подобных трудностей в этой ние таких элементов С#, как общая форма Сопрограммы, основные инструкции управления и операторы. При этом мы не будем углубляться в детали, а сосредото- чимся на общих концепциях создания Сопрограммы. Большинство затронутых тем более подробно рассматриваются в остальных главах части I.

предварительное знакомство с дру-

главе приводится краткое описа-

здесь

Объектно-ориентированное программирование

Главное в языке С# — реализация принципов объектно-ориентированного програм- мирования (ООП). Объектно-ориентированная методика неотделима от С#, и все С#- программы в имеют объектную чем приступать к написанию даже простой Сопрограммы, необходимо понять основные принципы ООП. — это мощный "рычаг", позволяющий усовершенствовать процесс програм-

какой-то степени

ориентацию. Поэтому, прежде

ООП мирования. С момента изобретения компьютера методы программирования менялись много раз и причем коренным образом, но в основном, с целью адаптации к непре- рывному повышению сложности программ. Например, программирование для первых компьютеров осуществлялось посредством набора машинных инструкций (в двоичном коде) программы не превышала бретен более сложные программы, используя символическое представление машинных инст-

на передней

панели компьютера.

Этот

метод

работал

до

тех

пор, пока

длина

нескольких

сот инструкций.

С

ростом

программ

был

изо-

язык ассемблер,

который позволил

программисту

писать гораздо

большие

и

уровня (например,

рукций.

программ FORTRAN и COBOL), которые позволили программистам справляться с возрастаю- щей сложностью программ. Когда эти первые компьютерные языки начали прибли- жаться к критическому состоянию, было изобретено структурное программирование. Каждая веха в развитии программирования характеризовалась созданием методов и средств, позволяющих программисту писать все более сложные программы. С каждым

По

мере

роста

появились языки высокого

шагом на этом пути изобретался новый метод, который, опираясь на самые удачные про-

методов, вносил что-то свое, осуществляя

элементы предыдущих гресс в области программирования в целом. рументария для программистов "дошло дело" и до объектно-ориентированного про- граммирования. Его появлению способствовал тот факт, что ектов начала серьезно стопориться, поскольку структурный

Примерно по такой

таким образом

схеме развития инст-

реализация многих про-

не поставленными задачами. Нужен был новый способ преодоления сложности программ,

подход уже

справлялся с

и решением этой проблемы стало объектно-ориентированное программирование.

Объектно-ориентированное программирование вобрало в себя лучшие идеи струк- турного программирования и объединило их с новыми концепциями. В результате появился более совершенный способ организации программы. Если говорить в самых одним

общих чертах, программу можно организовать код (т.е. на действия, или на то, что происходит

на

из двух в программе), либо на данные

способов: опираясь либо

(т.е.

воздействию). тельно методов структурного программирования программы обычно организовыва- лись с опорой на действия. Такой подход можно представить себе в виде кода, воз- действующего на данные.

на

то, что подвергается определенному

При использовании исключи-

Объектно-ориентированные программы работают совсем по-другому. Они органи- а ключевой

принцип такой организации гласит:

зованы вокруг данных,

именно дан- ные должны управлять доступом к коду. В объектно-ориентированном языке про-

код, который

над этими данными. Таким образом, тип данных точно определяет операции, которые

граммист

определяет

данные

и

разрешен для

выполнения действий

могут быть к ним применены.

 

наследование.

С#, имеют

черты: инкапсуляцию, полимор-

Инкапсуляция

Инкапсуляция — это механизм программирования, который связывает код (дейст-

и данные, которыми тельства вия) он манипулирует, и при этом предохраняет их от вмеша- код и
и данные, которыми
тельства
вия)
он манипулирует,
и
при
этом
предохраняет
их
от
вмеша-
код
и
данные
извне и неправильного использования. В объектно-ориентированном языке
что
можно
связать таким
образом,
ящик.
Внутри
все необходимые
будет создан автономный черный
свя-
данные
и
При таком
зывании
данных
который поддерживает инкапсуляцию.
кода
этого ящика находятся
создается
и
объект. Другими
код.
словами, объект — это
элемент,
данные
него или открытыми. Закрытый
Код,
или
обе
эти составляющие
объекта
могут
быть
закрытыми внутри
код
или
закрытые данные
известны лишь
остальной
части
этого объекта
и
доступны
только
ей.
Это
означает,
что
к закрытому
коду
или
данным
вне этого объекта.
не
может
получить доступ
Если код или данные
никакая другая
существующая
открытыми, к ним (несмотря на то,
часть программы,
что
внутри объекта)
другие части
программы.
Как
они определены
правило, открытые части объекта
являются
могут получить доступ
используются
для обеспечения
управляемого

интерфейса с закрытыми элементами.

единицей инкапсуляции в С# является класс.

Основной

Класс определяет как данные, так и код, который будет оперировать

— это

форму

объекта. Он задает

С#

этими данными. экземпляры

используется для создания объектов. образом, класс набор шаблонных ют, как построить объект. и данные, которые составляют класс, называются членами класса. Данные, оп-

В

Таким

класс

— это по сути

Объекты

класса.

элементов, которые показыва-

Код ределенные в классе, называются переменными экземпляра (instance variable), а код, ко-

торый оперирует этими данными, — методами-членами (member method), или просто методами. "Метод" — это термин, применяемый в С# для обозначения подпрограм-

мы. Если вы знакомы с языками С или C++, то, вероятно, догадываетесь о том, что

что С#-программист называет методом, С/С++-программист назовет функцией. А

то, поскольку С# — прямой потомок C++, термин "функция" также приемлемо исполь- зовать, когда речь идет о С#-методе.

Полиморфизм

Полиморфизм (от греческого слова polymorphism, означающего "много форм") — это

качество, которое позволяет одному интерфейсу получать доступ полиморфизма

вий. Простым

примером (интерфейс) остается рулем

может

независимо от того, зуется в автомобиле. Другими

послужить

щен с усилителем автомобиль поехать

к целому

классу

дейст-

автомобиля.

руль

Руль

механизма исполь- в любом

случае:

какой тип рулевого одинаково

осна- ли ваш автомобиль рулевым управлением прямого действия, рулевым управлением

влево

заставит

словами, руль работает

или реечным управлением.

Таким образом, независимо от типа используемого

поворот руля

в Достоинство такого единообразного интерфейса состоит, безусловно, в том, что, если

влево

нем

рулевого

управле-

ния. вы знаете, как обращаться с рулем, вы сможете водить автомобиль любого типа.

Тот стек (stack), т.е. область памяти, функционирующую

же

принцип можно

применить и

к программированию.

Рассмотрим, напри-

по принципу "последним

мер, пришел — первым обслужен". Предположим, вы пишете программу, для которой

нужно организовать три различных

типа стека.

Один

стек

предназначен для

целочис-

ленных

значений, второй — для

точкой,

— для

значений с плавающей

а третий

сим-

волов.

В этом

случае для

реализации

каждого

стека используется

один

и

тот

же

алго-

ритм, несмотря

на различие

ориентированного языка вам

типах

в

пришлось бы

сохраняемых

создать

данных.

три

В

набора

случае не объектно- "стековых" С# можно

подпро-

грамм, имеющих различные имена. Но благодаря

типа стека.

"стековых"

подпрограмм, который обрабатывает

стек, можно

Иными словами, зная, как использовать

все остальные.

фразой:

"один

интерфейс —

много методов".

можно разработать общий интерфейс. Полиморфизм позволяет понизить степень сложности

Это означает,

программы, предоставляя программисту возможность использовать один и тот же ин-

задания общего класса действий. Конкретное (нужное

случае) действие

(метод) выбирается компилятором. Программисту нет необходимо-

сти делать это вручную.

Его задача — правильно использовать общий интерфейс.

Наследование

Наследование — это процесс, благодаря которому один объект может приобретать свойства другого. Благодаря наследованию поддерживается концепция иерархической

(нисходящей) классификации

классификации.

иерархической организуется большинство областей знаний. Например, яблоки Красный Делишес яв-

управляемой

В

виде

ляются частью фрукты, а тот

классификации яблоки, которая в свою

— частью

еще большего

очередь класса пища. Таким образом, класс

является частью

класса

пища обла-

дает определенными качествами (съедобность, питательность и пр.), которые приме- и

к подклассу ские характеристики вых продуктов.

нимы

В (растут на деревьях,

фрукты. Помимо этих качеств, класс фрукты имеет специфиче-

(сочность, сладость и пр.), которые отличают классе

определяются и пр.). Класс

яблоки

их от других пище-

качества, специфичные для яблок качества

не тропические при кальными для этого сорта яблок. Если не использовать иерархическое представление признаков, для каждого объек- та пришлось бы в явной форме определить все присущие ему характеристики.

всех предыдущих

классов

и

Красный Делишес наследует

этом определяет

качества,

которые являются

уни-

Но

качества, которые де-

те лают его уникальным внутри его класса, поскольку он (объект) наследует общие атри- буты своего родителя. Следовательно, именно механизм наследования позволяет од- ному объекту представлять конкретный экземпляр более общего класса.

благодаря наследованию объекту

нужно доопределить

только

Первая простая программа

Настало время рассмотреть реальную Сопрограмму. /* Это

Сопрограмма.

простая

*/

Назовем

ее

Example.cs.

using System;

class Example {

// Любая Сопрограмма начинается с вызова метода Main() public static void Main() { Console.WriteLine("Простая Сопрограмма.");

средой разработки С#-

На программ была Visual Studio .NET. Эта среда позволяет отредактировать, скомпилиро- вать и выполнить Сопрограмму, причем это можно сделать двумя способами: с по- мощью компилятора командной строки csc.ex e или интегрированной среды разра- ботки (Integrated Development Environment — IDE). Здесь описаны оба способа. (Если вы используете иной компилятор, следуйте инструкциям, приведенным в сопроводи- тельной документации.)

момент написания этой книги единственной доступной

Использование компилятора командной строки esc. ехе

вы, разработки Visual

программ, приведенные

этой С#-компилятора командной

вероятности,

дующие действия.

1.

Ввести текст программы, используя любой текстовый редактор.
2. Скомпилировать программу.
3. Выполнить программу.

Ввод текста программы

Программы, представленные в этой книге, можно загрузить с Web-сайта компании

Osborne с адресом: www.osborne.com. Но при желании вы можете ввести текст про- грамм вручную. В этом случае необходимо использовать какой-нибудь текстовый ре- дактор, например Notepad. Однако помните, что при вводе текста программ должны быть созданы исключительно текстовые файлы, а не файлы с форматированием, ис- пользуемым при текстовой обработке, поскольку информация о форматировании по- мешает работе С#-компилятора. Введя текст приведенной выше программы, назовите

соответствующий

файл Example. cs.

Компилирование

программы

С#-компилятор, csc.exe ,

Чтобы командной строке имя исходного файла.

скомпилировать

C:\>csc Example.cs

Компилятор esc

с MSIL-версию этой программы. Хотя

создаст

файл

в ехе-файле.

программу,

запустите

указав

в

Example.exe, MSIL-код не является выполняемым, тем

именем

который будет содержать

не При попытке выполнить файл Example.exe система

ме-

он содержится

нее Common Language Runtime автоматически вызовет ЛТ-компилятор. Однако имейте в

виду: если

выполнить Example. ехе котором

компьютере,

(или любой

вы попытаетесь

MSIL-код)

другой

ехе-файл,

среда

со-

.NET

держащий Framework, программа выполнена не будет ввиду отсутствия

на

в

не

установлена

системы CLR.

I Па заметку

Перед запуском компилятора csc.exe

кетный файл vcvars32 .bat,

который

вам, обычно расположен в папке

возможно, придется выполнить па-

//Program

Files/Microsoft

visual

studio

.NET/Vc7/Bin. В качестве альтернативно-

приглашению на ввод команды. С# этот режим инициализируется выбором команды Microsoft Visual Studio

го варианта можно перейти в режим работы по

Для

.NET&Visual Studio .NET Command Prompt ^Visual

Studio .NET Tools из меню

Пуск ^Программы, активизируемом на панели задач.

Выполнение программы

I

Для выполнения программы достаточно С:\>Example

 

строку.

выполнении этой программы на экране отобразится следующая информация:

I

Сопрограмма.

Использование Visual Studio IDE

Теперь можно обратиться к версии 7 пакета Visual Studio .NET, поскольку Visual Studio IDE позволяет компилировать Сопрограммы. Чтобы отредактировать, скомпилировать и выполнить Сопрограмму с помощью интегрированной среды разработки пакета Visual Studio (версия 7), выполните следующие действия. (Если вы работаете с другой версией пакета Visual Studio, возможно, придется следовать другим инструкциям.)

1.

(пустой)

новый (Файл <=> Создать=> Проект).

С#-проект,

File^New^Project

2.

Среди представленных

типов проектов (на панели Project Types (Типы проек-

тов)) выберите вариант

Visual C# Projects

(Проекты Visual

C#), а затем

(как по-

казано на рис. 2.1) на панели Templates (Шаблоны) — шаблон Empty Project

(Пустой проект).

New Project

Project Types:

 

wJ Visual Basic Projects il* Visual C# Projects

' (LJ Visual ;• £d Setup

C++ Projects

and Deployment Projects

E&J Other Projects

'

Visual Studio Solutions

Templates:

 

ASP.NET

ASP.NET

Web Control ; :

Web Ap ...

WebS

...

Library

 

I

P

Console

Windows

 

Application

Service

;An empty projectfor c reating a local application

location:

jProjectl

J D:\Work\Nina\Visual Studio Projects

Browse..

Project will be created at D:\WorkVSIina\Visual Studio Projects\projectl.

OK

Puc.

2.1.

Окно New Project (Создать проект)

Cancel

Help