Вы находитесь на странице: 1из 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. Индексаторы и свойства

256

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

277

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

319

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

349

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

Глава

375

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

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

409

431

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

449

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

484

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

50 1

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

502

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

541

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

575

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

610

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

645

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

669

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

670

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

689

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

707

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

73 1

   

732

737

"

740

Содержание

 

17

18

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

21

Глава 1. Создание языка С#

22

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

Создание

23

23

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

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

24

25

Создание С#

26

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

27

О среде .NET Framework

27

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

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

58

60

 

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

203

208

212

213

213

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

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

Классы потоков Класс Stream

377

378

378

380

380

380

382

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

383

Как открыть Считывание байтов из объекта класса FileStream

Запись данных в файл Использование класса FileStream

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

для копирования файла на символы Использование класса StreamWriter Использование класса StreamReader Перенаправление стандартных потоков Считывание и запись двоичных данных Класс BinaryWriter Класс BinaryReader Демонстрация использования двоичного ввода-вывода Файлы с произвольным доступом Использование класса MemoryStream Использование классов StringReader и StringWriter Преобразование числовых строк во внутреннее представление

Файловый ввод-вывод с ориентацией

383

385

386

387

389

389

391

392

394

394

395

396

400

402

404

405

Глава 15. Делегаты и события 409 Делегаты 410 Многоадресная
Глава
15. Делегаты и события
409
Делегаты
410
Многоадресная передача
Класс System.Delegate
413
415
Назначение делегатов
416
События
416
Пример события для многоадресной передачи
418
Сравнение
методов
экземпляров
классов
со статическими
методами,
используемыми в качестве обработчиков событий
419
Использование событийных средств доступа
421
Смешанные средства обработки событий
Рекомендации по обработке событий в среде .NET Framework
Использование встроенного делегата EventHandler
Учебный проект: использование событий
425
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

 

503

504

509

510

511

Decimal Структура Char Boolean

Структура

Структура

Класс Array

Сортировка массивов и поиск заданного элемента

Реверсирование массива

Копирование массивов Класс BitConverter Генерирование случайных чисел с помощью класса Random G C

памятью Класс Object Интерфейс IComparable Интерфейс IConvertible Интерфейс ICloneable Интерфейсы IFormatProvider и IFormattable

Управление

и класс

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

514

518

523

523

524

526

527

532

534

536

537

537

538

538

540

541

   

542

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

594

Взаимодействие потоков с помощью методов Wait(), Pulse() и PulseAll()

594

Пример использования методов Wait() и PulseQ

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

617

621

622

623

625

629

631

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. Применение языка С#

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

"

669

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

692

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

692

694

694

695

695

696

696

696

697

699

700

702

706

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

707

 

708

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

709

 

710

711

713

719

720

728

728

 

731

732

733

734

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

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

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

Введение

Программисты — такие люди, которым всегда чего-то не хватает: мы без конца ищем способы повышения быстродействия программ, их эффективности и переноси- мости. Зачастую мы требуем слишком многого от инструментов, с которыми работа- ем, особенно, когда это касается языков программирования. Хотя таких языков суще- ствует великое множество, но только некоторые из них по-настоящему сильны. Эф- фективность языка заключается в его мощности и одновременно — в гибкости. Синтаксис языка должен быть лаконичным, но ясным. Он должен способствовать созданию корректного кода и предоставлять реальные возможности, а не ультрамод- ные (и, как правило, тупиковые) решения. Наконец, мощный язык должен иметь од- но нематериальное качество: вызывать ощущение гармонии. Как раз таким языком программирования и является С#. Созданный компанией Microsoft для поддержки среды .NET Framework, язык С# опирается на богатое наследие в области программирования. Его главным архитекто- ром был ведущий специалист в этой области — Андерс Хейлсберг (Anders Hejlsberg). С# -— прямой потомок двух самых успешных в мире компьютерных языков: С и 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. Именно эта часть биб- лиотеки особым образом связана с С#. Кроме того, здесь описаны коллекции, орга- низация многопоточной обработки и сетевые возможности. Эти разделы библиотеки будет использовать практически каждый, кто программирует на С#. Часть III содержит примеры применения С#. В главе 24 продемонстрировано соз- дание программных компонентов, а в главе 25 описано создание Windows- приложений с использованием библиотеки Windows Forms. В главе 26 показан про- цесс разработки программы синтаксического анализа числовых выражений методом рекурсивного спуска (recursive descent parser).

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

Для работы

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

этой

с

книгой опыта

изучить

в области

Если вы

для

программирования не требуется.

С# у вас не будет проблем, не считаете

придется

тщательно

Если

же

с этими языками. С#, но примерах, приведенных в каждой главе.

стом, книга поможет

С# много

поскольку

себя опытным программи-

в

общего

этого

разобраться

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

Чтобы скомпилировать и выполнить программы из этой книги, необходимо уста- новить на своем компьютере пакет Visual Studio .Net 7 (или более позднюю версию), а также оболочку .NET Framework.

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

Исходный код всех программ, приведенных в книге, можно загрузить с Web-сайта с адресом: www.osborne.com.

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

Книга Полный справочник по С# — это "ключ"

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

книг п о программирова-

• С#: 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 ОТиздательства

Вы, читатель

и

что

ждем

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

еще

этой

вы

хотели

увидеть

бы высказать

в наш

адрес

комментариев и надеемся на них.

можете

Вы

наш Web-сервер

нет

словом, любым

удобным

для

эта

книга, а также

выскажите

указать

книги, и есть

ее критик и комментатор.

Мы ценим

ва-

сделать

ше мнение и хотим

лучше

любые другие

Мы мажное или электронное письмо, либо просто посетить Одним вам

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

Посылая письмо или сообщение, не забудьте также зательно учтем ординаты:

а

свои замечания там.

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

изданным нами. Нам интересно услышать и

прислать нам бу-

и вас способом дайте свое

мнение

о том,

оставить

нам

как

название

и ее авторов,

к изданию последующих

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

книг. Наши ко-

ваш обратный адрес.

при отборе

его

E-mail

info@williamspublishing.com

WWW

http://www.williamspublishing.co m

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

 

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

Украины 1

03150, Киев, а/я 152

Полный

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

ЯзыкС#

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

Полный

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

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

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

Я вания. Его создание вызвано процессом усовершенствования и адаптации, ко- торый определял разработку компьютерных языков в течение последних лет. Подобно всем успешным языкам, которые увидели свет раньше, С# опирается на прошлые достижения постоянно развивающегося искусства программирования. В языке С# (созданном компанией Microsoft для поддержки среды .NET Frame- work) проверенные временем средства усовершенствованы с помощью самых совре- менных технологий. С# предоставляет очень удобный и эффективный способ написа- ния программ для современной среды вычислительной обработки данных, которая включает операционную систему Windows, Internet, компоненты и пр. В процессе становления язык С# переопределил весь "ландшафт" программирования. Назначение этой главы — рассмотреть С# в исторической среде, исследовать мо- тивы его создания и конструктивные особенности, а также степень влияния на него других языков программирования. Описана связь С# со средой .NET Framework.

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

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

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

процессе такого "перекрестного опыления" средства

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

из одного

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

Начало современной эпохи программирования отмечено созданием языка С. Он был разработан Дэнисом Ритчи (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++ по-прежнему имеет неоспоримое превосходство при разработке высокопроизводительных программ системного уровня. Важно понимать, что создание C++ не было попыткой изобрести совершенно но- вый язык программирования. Это было своего рода усовершенствование и без того очень успешного языка. Такой подход к разработке языков (взять за основу сущест- вующий язык и поднять его на новую ступень развития) дал начало тенденции, кото- рая продолжает жить и сегодня.

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

Следующей ступенью на лестнице прогресса языков программирования стал язык Java, который первоначально назывался Oak (в переводе с англ. "дуб"). Работа над его созданием началась в 1991 году в компании Sun Microsystems. Основной движущей силой разработки Java был Джеймс Гослинг (James Gosling). В его рабочую группу входили Патрик Нотон (Patrick Naughton), Крис Уортс (Chris Warth), Эд Фрэнк (Ed 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++. Хотя Java-код несовместим с С или 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 разработала язык С#. С# был соз- дан в конце 1990-х годов и стал частью общей .NET-стратегии Microsoft. Впервые он увидел свет в качестве а-версии в середине 2000 года. Главным архитектором С# был Андерс Хейлсберг (Anders Hejlsberg) — один из ведущих специалистов в области язы- ков программирования, получивший признание во всем мире. Достаточно сказать, что в 1980-х он был автором весьма успешного продукта Turbo Pascal, изящная реализа- ция которого установила стандарт для всех будущих компиляторов.

С# непосредственно связан с С, C++ и Java. самые популярные и самые любимые почти все профессиональные программисты сегодня знают С и C++ , и большинство

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

со не собирался изобретать свое

этих "фундаментальных" стороны программистов.

И

это

не случайно.

Эти три

языка —

языки программирования в мире. Более того,

происходит

без особых

усилий

языков к "надстройке" Так

как Андерс

Хейлсберг

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

От С язык С# унаследовал синтаксис, многие ключевые слова

того, С# построен на улучшенной

и операторы. Кроме объектной модели, определенной в C++. Если вы друзьями.

или C++, то с С# вы сразу

знаете

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

С С# и Java связаны

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

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

оборот,

"генов".

язык Java, то

вам придется

будут знакомы многие понятия С#.

знаете

вы

в будущем

вам

И Java, то, познакомившись с С#, вам не

на-

изучать

Java

C++

С#

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

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

СвязьС#соболочкой.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 определяет переноси- мость ассемблера. И хотя концептуально MSIL подобен байт-коду Java, это не одно и то же. Цель 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 Studio, использование С#- и выпол- про-

нить примеры

грамм

сле-

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

проектов вы, по всей вероятности, бу-

Несмотря

на

то

что

случае коммерческих

компилятора командной строки — самый простой способ скомпилировать

программ,

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

приведенные

этой книге. Для

строки

создания

с помощью

необходимо

и

запуска

выполнить

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

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

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

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

программы

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

Чтобы командной строке имя исходного файла. C:\>csc Example.cs

Компилятор esc создаст файл с именем Example.exe, который будет содержать MSIL-версию этой программы. Хотя MSIL-код не является выполняемым, тем не ме- нее он содержится в ехе-файле. При попытке выполнить файл Example.exe система Common Language Runtime автоматически вызовет ЛТ-компилятор. Однако имейте в виду: если вы попытаетесь выполнить Example. ехе (или любой другой ехе-файл, со- держащий MSIL-код) на компьютере, в котором не установлена среда .NET Framework, программа выполнена не будет ввиду отсутствия системы CLR.

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

программу,

запустите

указав

в

IПа заметку

возможно, придется выполнить па- кетный файл vcvars32 .bat, который обычно расположен в папке //Program

Files/Microsoft

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

Для .NET&Visual Studio .NET CommandPrompt^Visual

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

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

вам,

visual

studio

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

Studio .NET Tools изменю

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

Для выполнения программы достаточно ввести ее имя в командную строку.

I С:\>Example При

выполнени и это й программ ы I Простая

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

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

ИспользованиеVisualStudio 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 (Пустой проект).

NewProject

Project Types:

wJ Visual Basic Projects il*Visual C#Projects ' (LJVisual C++ Projects ;•£dSetup and Deployment Projects E&J Other Projects

'

Ш

Visual Studio Solutions

Templates:

 

ASP.NET

 

ASP.NET

Web Ap

.

WebS

I

P

Console

 

Windows

Application

Service

;Anempty projectforcreating a local application

jProjectl

J D:\Work\Nina\Visual Studio Projects

location:

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

OK

Cancel

Puc.

2.1.

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

Web Control ; :

Library

Browse

Help

3.

Создав проект, щелкните правой кнопкой мыши на имени проекта в окне Solution Explorer (Проводник решений) Затем, используя всплывающее контекстное меню, выберите команду Add^Add New Item (Добавить^Добавить новый элемент) При этом экран должен выглядеть, как показано на рис 2 2

4. В открывшемся диалоговом окне Add New Item (Добавить новый элемент) на па- нели Categories (Категории) выберите вариант Local Project Items (Элементы ло- кальных проектов), а на панели Templates — шаблон Code File (Файл с текстом программы) Приэтом экран должен выглядеть, как показано на рис 2 3

I] > «»Sol utoin Projectl(1 project)

+ a Budli

Rebudli

cr

H A<&Newtlem

tJ

Add ExistingItem New Fodler

.3

Add Wnidows Form Add Inherited Form

Add User Control

3

Add Inherited Confrol

ij

Add Component Add Calss

A$j

Add Reference

f\

Add Web Reference Setas Startup Project

Debug

>

i

SaveProjectl

X

Remove

Rename

Properties

2 2

Контекстные меню при выборе команды Add&Add NewItem

Рис

Name

IcodeFilelcs

Open

Рис 2 3 Диалоговоеокно Add New Item

User Control Data Form Wizard

XML File

XML

Schema

Cancel

Data Set

Help

5.

Введите текст программы и сохраните файл под именем Example.cs. (Пом- ните, что программы, представленные в этой книге, можно загрузить с Web- сайта компании Osborne с адресом: www.osborne.com.) После этого экран должен выглядеть, как показано на рис. 2.4.

fExampte.cs*

1

I

F

Это простая С#-программа.

Назовем ее Example.cs.

using System;

*"j class Example

iL

Рис. 2.4. Окно проекта Example,

cs

6. Скомпилируйте программу с помощью команды Build^Build Solution (Постро- ить 1 ^ Построить решение).

7. программу

Debug^Start

Without

Debugging

с (ОтладкамНачать выполнение без отладки). После выполнения этой программы вы должны увидеть окно, показанное на рис. 2.5.

Выполните

помощью

команды

!^D:\Work\Nta\V^ Простая Си-программа. Press any key to continue,

шт-

;№*!

Рис. 2.5.Диалоговое окно Add New Item

\\\'d заметку

Чтобы скомпилировать и выполнить примеры программ, представленные в этой книге, нет необходимости для каждой программы создавать новый про- ект. Можно использовать тот же самый С#-проект. Просто удалите текущий файл и добавьте новый. Затем перекомпилируйте его и выполните.

книги )

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

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

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

ком -

перво й

част и

прощ е

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

Несмотря на миниатюрные размеры, программа Example.cs включает ряд ключе- вых средств, которые применимы ко всем Сопрограммам. Поэтому имеет смысл подробно рассмотреть каждую часть программы, начиная с имени.

В отличие от некоторых языков программирования (например, Java), в которых

имя программного файла имеет очень большое значение, С#-программа может иметь любое имя. С таким же успехом вы могли бы назвать первую в этой книге программу не Example, cs, а, скажем, Sample, cs, Test.c s или даже X.cs.

По соглашению для исходных файлов Сопрограмм используется расширение .cs ,

и этому соглашению вы должны следовать безоговорочно. Многие программисты на-

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

по

своему вкусу. Первая наша программа начинается со следующих

строк.

/* Это простая С#-программа.

Назовем ее Example.cs.

*/

Эти строки образуют комментарий. Подобно большинству других языков програм- мирования С# позволяет вводить в исходный файл программы комментарии, содер- жимое которых компилятор игнорирует. С помощью комментариев описываются или разъясняются действия, выполняемые в программе, и эти разъяснения предназнача- ются для тех, кто будет читать исходный код. В данном случае в комментарии дается общая характеристика программы и предлагается назвать этот исходный файл именем Example.cs. Конечно, в реальных приложениях комментарии используются для разъ- яснения особенностей работы отдельных частей программы или конкретных действий программных средств.

В С# поддерживается три стиля комментариев. Первый, показанный в начале рас-

сматриваемой программы, называется многострочным. Комментарий этого типа дол- жен начинаться символами /* и заканчиваться ими же, но в обратном порядке (*/).

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

I using

System;

пространство имен System. В С# пространство имен (namespace) определяет декларативную область. Подробнее о про- странствах имен мы поговорим позже, а пока ограничимся тем, что заявленное про- странство имен позволяет хранить одно множество имен отдельно от другого. Други- ми словами, имена, объявленные в одном пространстве имен, не будут конфликтовать с такими же именами, объявленными в другом. В нашей программе используется пространство имен System, которое зарезервировано для элементов, связанных с биб- лиотекой классов среды .NET Framework, используемой языком С#. Ключевое слово

Эта строка означает, что программа использует

usin g — это своего рода ном пространстве имен. Перейдем к следующей строке программы.

1

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

clas s

Example

{

имена

в

задан-

В этой строке используется ключевое слово class , которое объявляет об опреде-

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

Очередная строка в нашей программе представляет собой однострочный комментарий.

I

//

Любая

Сопрограмма

начинается

с

вызова

метода

Main().

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

I

public

stati c

void

Main()

{

В этой строке начинается определение метода Main(). Как упоминалось выше, в

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

Ключевое слово publi c

представляет собой спецификатор доступа (access

specifier).

Спецификатор доступа определяет, как другие части программы могут получать дос- туп к члену класса. Если объявление члена класса включает ключевое слово public , значит, к этому члену можно получить доступ с помощью кода, расположенного вне класса, в котором этот член объявлен. (Противоположным по значению ключевому слову publi c является слово private , которое не допускает использования соответ- ствующего члена класса кодом, определенным вне его (члена) класса.) В данном слу- чае метод Main () объявляется как public-метод, поскольку при запуске этой про- граммы он будет вызываться внешним (по отношению к его классу) кодом (а именно операционной системой).

1 На заметку

На момент написаниякниги в документации на язык С# не было обозначено требования, чтобы Main () объявлялся какpublic-метод. Однако именно та- ким образом оформлены подобные объявления в примерах, включенных в опи- сание пакета Visual Studio .NET. Этот способобъявления предпочитают ис- пользовать многие СП-программисты. Поэтому и в настоящей книге метод Main () объявляетсяс использованием спецификатора public. Но вы не должны удивляться, встретив несколько иной способ объявления метода Main ().

Ключевое слово stati c позволяет реализовать вызов метода Main() еще до созда- ния объекта соответствующего

класса. Это — очень важный момент, поскольку метод

Main () вызывается при запуске программы. Ключевое слово voi d просто сообщает компилятору о том, что метод Main () не возвращает значения. Как будет показано выше, методы могут возвращать значения. Пустые круглые скобки после имени Main () говорят о том, что методу не передается никакой информации. Как будет по- казано выше, методу Main () (или любому другому) можно передавать данные, кото- рые будут им обрабатываться. Рассматриваемую строку венчает символ открывающей фигурной скобки ({), который служит признаком начала тела метода Main(). Между открывающей и закрывающей фигурными скобками и должен находиться весь код, составляющий тело метода. Рассмотрим следующую строку программы. Обратите внимание на то, что она принадлежит телу метода Main ().

I

Console.WriteLine("Простая

С#-программа.");

"Простая

С#-программа. " и

строки следующего за ней символа новой строки. Сам вывод осуществляется встроенным ме- тодом WriteLine (). В данном случае на экране будет отображена строка, переданная методу. Передаваемая методу информация называется аргументом. Помимо текстовых строк, метод WriteLine () может отображать и данные других типов. Console — это имя встроенного класса, который поддерживает консольные операции ввода-вывода данных. Связав класс Console с методом WriteLine (), вы тем самым сообщаете компилятору, что WriteLine () — член класса Console. Тот факт, что в С# для опре- деления консольного вывода данных используется некоторый объект, является еще одним свидетельством объектно-ориентированной природы этого языка программи- рования. Обратите внимание на то, что инструкция, содержащая вызов метода WriteLine (), завершается точкой с запятой, как и рассмотренная выше инструкция программы usin g System. В С# точкой с запятой завершаются все инструкции. Если же вы встречаете строки программы, которые не оканчиваются точкой с запятой, зна- чит, они попросту не являются инструкциями. Первая в программе закрывающая фигурная скобка (}) завершает метод Main (), а вторая — определение класса Example.

прописные и строчные буквы. Игнорирование

И этого факта может вызвать серьезные проблемы. Например, если случайно вместо имени Main ввести имя main или вместо WriteLine ввести writeline , то рассмот- ренная ниже программа сразу же станет некорректной. Более того, хотя С#- компилятор компилирует классы, которые не содержат метода Main (), у него нет возможности выполнить их. Поэтому, даже если вы введете имя Main с опечаткой (main), компилятор все равно скомпилирует программу. Но затем вы получите сооб- щение об ошибке, уведомляющее о том, что в файле Example.exe не определена точ- ка входа.

Здесь реализован вывод на экран текстовой

В языке С# различаются

еще.

Обработка синтаксических ошибок

(если

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

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

Введите,

скомпилируйте

выше программу

ма т () , компилятор IDE сгенери- рует последовательность "обнаруженных" ошибок, показанную на рис 2 6 (аналогич- ный отчет об ошибках генерируется и в результате вызова компилятора командной строки esc)

крывающую фигурную скобку после имени метода

} Description

_

i File

_

_

_

_

trie

, expected

D\Work\Nma\Visual

\Projectl\fxampte cs

13

Type ornamespace definition orend offile expected

D\Work\Nna\Visual

 

\Projectl\|Example cs

17

i

 

2 6 Отчет обошибках

Очевидно, первое сообщение об ошибке неверно, поскольку пропущена не точка с запятой, а фигурная скобка Следующие два сообщения вообще могут лишь сбить с

толку

Цель этих рассуждений — доказать, что если в программе присутствует синтаксиче- ская ошибка, то не все сообщения компилятора следует принимать "за чистую монету" Они могут легко ввести в заблуждение Чтобы найти ошибку, нужно при анализе сооб- щений, генерируемых компилятором, научиться "ясновидению" Кроме того, делу мо- жет помочь просмотр нескольких последних строк кода, непосредственно предшест- вующих строке с "обнаруженной" ошибкой Ведь иногда компилятор начинает "чуять недоброе" только через несколько строк после реального местоположения ошибки

Небольшая вариация натему первой программы

Несмотря на то что инструкцию

I using

System;

в тись Однако не стоит забывать, что она предоставляет большое удобство для про- граммиста Причина же ее необязательности состоит в том, что в С# можно всегда полностью определить имя с использованием пространства имен, которому оно при- надлежит Например, программную строку

можно обой-

используют

все программы

этой книге, в первой программе

без

нее

I Console.WriteLine("Проста я С#-программа.") ;

I System.Console.WriteLine("Простая

можно заменить следующей

С#-программа.");

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

//

Эта

версия

не

включает

class Example {

инструкцию

usin g

System.

// Любая С#-программа начинается с вызова метода Мат() . public static void Main() {

// Здесь имя Console.WriteLine полностьюопределено. System.Console. WriteLine ( "Простая Сопрограмма. ") ;

Поскольку довольно утомительно указывать пространство имен System везде, где используется его член, большинство С#-программистов включают в начало программ

(эта участь постигла и все программы, представленные в

этой книге). Однако важно понимать, что при необходимости можно полностью оп-

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

инструкцию usin g System

Вторая простаяпрограмма

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

using

System;

clas s

Example2

{

public

stati c

 

void

Main()

{

Эта

программа создает две

программа

демонстрирует

переменные с именами х

и

переменными.

работу

с

у.

i n t

x;

//

переменная.

i n

t

у;

//

переменная.

 

=

100;

//

100.

Console.WriteLine("х

 

"

+

х) ;

'

/

2;

Console.Write("у

 

/

2:

") ;

Console.WriteLine(у);

 

выполнени и этой профамм ы вы должны увидеть следующий результат:

 

100

| х

/

2:

50

Что же нового в этой программе? Итак, инструкция

//

I Здесь

int

x;

объявляется

переменная.

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

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

значения, т.е. целые числа. достаточно поставить перед ее именем ключевое слово int . Таким образом, инструк- ция in t x ; объявляет переменную х типа int .

Следующая строка программы объявляет вторую переменную с именем у.

I

in t

у;

//

Здесь

объявляется

еще

одна

переменная.

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

в предыдущей строке кода. Разница состоит лишь в именах объявляемых

типимя_переменной;

Здесь с помощью элемента тип задается тип объявляемой переменной, а с помо- щью элемента имя_переменной — ее имя. Помимо типа int , C# поддерживает и другие типы данных. Следующая строка кода присваивает переменной х значение 100.

I х

=

100;

//

Здесь

переменной

х

присваивается

100.

В С#

оператор присваивания представляется одиночным знаком равенства (=). Его

действие заключается в копировании значения, расположенного справа от оператора,

в переменную, указанную слева от него. Следующая строка кода выводит значение переменной х, предваряя его текстовой

"х 1 Console.WriteLine("х

этой инструкции знак "плюс" означает не операцию сложения, а последователь- слу- чае, используя оператор "+" , можно в одной инструкции вызова метода WriteLin e () сформировать сцепление элементов в нужном количестве. Следующая строка кода присваивает переменной у значение переменной х, разде- ленное на 2.

|

ное отображение заданной текстовой строки и значения переменной х.

строкой

".

содержит

"

+

х)

;

содержит

В

В общем

/

2;

У

-

х

При выполнении этой строки программы значение переменной х делится на 2, а затем полученный результат сохраняется в переменной у. Таким образом, переменная

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

+

Сложение

Вычитание

* / Рассмотрим две строки программы:

Умножение

Деление

I Console.WriteLine(у);

Console.Write("у

содержит

х

/

2:

") ;

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

х / 2 : " используется не уже знакомый нам метод WriteLin e () , а встроенный метод

Write (). В этом случае выводимая текстовая строка не сопровождается символом но-

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

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

I

in t

у;

//

х,

Объявление

обеих

переменных

в

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

Другие типы данных

В предыдущей программе мы использовали переменную типа int . Однако в пере-

менной типа in t можно хранить только целые числа. Следовательно, ее нельзя ис- пользовать для обработки дробной части числа. Например, в int-переменной может содержаться значение 18, но отнюдь не значение 18,3. К счастью, тип данных in t — не единственный тип, определенный в С#. Для обработки чисел с дробной частью в С# предусмотрены два типа данных с плавающей точкой, floa t и double, которые представляют значения с обычной и удвоенной точностью, соответственно. (Тип double пользуется у программистов "повышенным спросом".) Для объявления переменной типа double используйте инструкцию, подобную сле-

дующей:

I

double

result ;

Здесь resul t

— это имя переменной типа double. Поскольку переменная

resul t

имеет тип double, она может хранить такие значения, как 122,23, 0,034 или —19,0.

понять различие между типами данных следующую программу:

Чтобы лучше

in t

и

double,

рассмотрим

/*

Эта программа иллюстрирует различие между типами int и double.

*/

using System;

class Ехашр1еЗ { public static void Main() {

int ivar;

double dvar; // Объявляем переменную типа double.

ivar =100 ;

// Объявляем переменную типа int.

//

Присваиваем переменной ivar

// значение 100.

dvar •= 100.0; // Присваиваем переменной dvar // значение 100.0.

Console.WriteLine( "Исходное значение переменной ivar: " +

Console.WriteLine( "Исходное значение переменной dvar: " + dvar);

ivar);

Console.WriteLine(); // Выводим пустую строку.

// Теперь делим оба значения на 3.

ivar = ivar / 3;

dvar = dvar / 3.0;

Console.WriteLine("ivar после деления: " + ivar); Console.WriteLine("dvar после деления: " + dvar);

Вот как выглядит результат выполнения этой программы:

I Исходное

ivar :

100

I Исходное

dvar :

100

I lvar после деления: 33 dvar после деления: 33.3333333333333

а ленного деления, результат которой равен 33, т.е. дробная часть отбрасывается. Но при делении переменной dva r на 3 дробная часть сохраняется. Итак, если нужно определить в программе значение с плавающей точкой, необхо- бу- дет интерпретироваться как целое число. Например, в С# число 100 рассматривается как целое, а число 100. 0 — как значение с плавающей точкой. вывода

3 выполняетс я операци я целочис -

iva r

н

Как

видите ,

пр и

делени и

переменно й

димо включить в его представление десятичную точку.

Если этого

не сделать,

оно

внимание на то,

Обратите WriteLin e без аргументов. Тип чениями, т.е. когда необходимо учитывать дробную часть каждого числа. Например, ^следующая программа вычисляет площадь круга, используя для п значение 3,1416. //

что для

пустой строки достаточно

вызвать метод

зна-

данных с плавающей точкой обычно используется

Вычисляем

площадь

using System;

круга.

class Circle { static void Main() { double radius; double area;

при работе

с реальными

radius = 10.0; area = radius * radius * 3.1416;

Console.WriteLine("Площадь равна " + area);

Результат выполнения» этой программы таков:

I

Площадь