Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
Скачать 5.05 Mb.
|
Автор бестселлеров по программированию: продано более 3 миллионов его книг! “Герберт Шилдт написал книгу, которую должен иметь каждый, кто программирует на C#.” -Прашант Шридхаран, управляющий выпуском C# продуктов, Microsoft БЕ СП ЛА ТН ЫЙ В INT ER NE T Osborne Mc Graw Hill Полный справочник по C# Герберт Шилдт ББК 32.973.26-018.2.75 Ш57 УДК 681.3.07 Издательский дом “Вильямс” Зав. редакцией С.Н. Тригуб Перевод с английского и редакция Н.М. Ручко По общим вопросам обращайтесь в Издательский дом “Вильямс” по адресу: info@williamspublishing.com, http://www.williamspublishing.com Шилдт, Герберт. Ш57 полный справочник по C#. : Пер. с англ. — М. : Издательский дом “Вильямс”, 2004. — 752 с. : ил. — Парал. тит. англ. ISBN 5-8459-0563-Х (рус.) В этом полном справочнике по C# — новому языку программирования, разработанному специально для среды .NET, — описаны все основные аспекты языка: типы данных, операторы, управляющие инструкции, классы, интерфейсы, делегаты, индексаторы, события, указатели и директивы препроцессора. Подробно описаны возможности основных библиотек классов C#. Автор справочника — общепризнанный авторитет в области программирования на языках C и C++, Java и C# — включил в книгу полезные советы и сотни примеров с комментариями, которые удовлетворят как начинающих программистов, так и опытных специалистов. Этот справочник обязан иметь под рукой каждый, кто программирует на C#. ББК 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. Язык C# 21 Глава 1. Создание языка C# 22 Глава 2. Обзор элементов языка C# 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. Делегаты и события 409 Глава 16. Пространства имен, препроцессор и компоновочные файлы 431 Глава 17. Динамическая идентификация типов, отражение и атрибуты 449 Глава 18. Опасный код, указатели и другие темы 484 Часть II. Библиотека C# 501 Глава 19. Пространство имен System 502 Глава 20. Строки и форматирование 541 Глава 21. Многопоточное программирование 575 Глава 22. Работа с коллекциями 610 Глава 23. Сетевые возможности и использование Internet 645 Часть III. Применение языка C# 669 Глава 24. Создание компонентов 670 Глава 25. Создание Windows-приложений 689 Глава 26. Синтаксический анализ методом рекурсивного спуска 707 Часть IV. Приложения 731 Приложение А. Краткий обзор языка комментариев XML 732 Приложение Б. C# и робототехника 737 Предметный указатель 740 6 Содержание Содержание Об авторе 17 Введение 18 Часть I. Язык C# 21 Глава 1. Создание языка C# 22 Генеалогическое дерево C# 23 Язык C, или начало современной эпохи программирования 23 Создание ООП и C++ 24 Internet и появление языка Java 25 Создание C# 26 Связь C# с оболочкой .NET Framework 27 О среде .NET Framework 27 Функционирование системы CLR 28 Сравнение управляемого кода с неуправляемым 28 Спецификация универсального языка 29 Глава 2. Обзор элементов языка C# 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 Ключевые слова C# 51 Идентификаторы 51 Библиотеки классов C# 52 Глава 3. Типы данных, литералы и переменные 53 О важности типов данных 54 Типы значений в C# 54 Целочисленные типы 55 Типы для представления чисел с плавающей точкой 57 Тип decimal 58 Символы 60 Содержание 7 Тип bool 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 Глава 6. Введение в классы, объекты и методы 126 Введение в классы 127 Общая форма определения класса 127 8 Содержание Определение класса 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-инструкциях 178 Глава 8. Подробнее о методах и классах 179 Управление доступом к членам класса 180 Спецификаторы доступа C# 180 Применение спецификаторов доступа public и private 182 Управление доступом: учебный проект 182 Передача объектов методам 187 Как происходит передача аргументов 189 Использование ref- и out-параметров 191 Использование модификатора ref 191 Использование модификатора out 193 Использование модификаторов ref и out для ссылочных параметров 195 Использование переменного количества аргументов 197 Возвращение методами объектов 199 Содержание 9 Возвращение методами массивов 202 Перегрузка методов 203 Перегрузка конструкторов 208 Вызов перегруженного конструктора с помощью ссылки this 212 Метод Main() 213 Возвращение значений из метода Main() 213 Передача аргументов методу Main() 213 Рекурсия 215 Использование модификатора типа static 218 Статические конструкторы 223 Глава 9. Перегрузка операторов 224 Основы перегрузки операторов 225 Перегрузка бинарных операторов 226 Перегрузка унарных операторов 228 Выполнение операций над значениями встроенных C#-типов 232 Перегрузка операторов отношений 236 Перегрузка операторов true и false 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 10 Содержание Глава 12. Интерфейсы, структуры и перечисления 319 Интерфейсы 320 Реализация интерфейсов 321 Использование интерфейсных ссылок 325 Интерфейсные свойства 327 Интерфейсные индексаторы 328 Наследование интерфейсов 330 Сокрытие имен с помощью наследования интерфейсов 331 Явная реализация членов интерфейса 331 Закрытая реализация 332 Как избежать неопределенности с помощью явной реализации 333 Выбор между интерфейсом и абстрактным классом 334 Стандартные интерфейсы среды .NET Framework 334 Учебный проект: создание интерфейса 335 Структуры 340 Зачем нужны структуры 343 Перечисления 345 Инициализация перечислений 347 Задание базового типа перечисления 347 Использование перечислений 347 Глава 13. Обработка исключительных ситуаций 349 Класс System.Exception 350 Основы обработки исключений 350 Использование try- и catch-блоков 351 Пример обработки исключения 351 Второй пример исключения 353 Последствия возникновения неперехватываемых исключений 354 Возможность красиво выходить из ошибочных ситуаций 356 Использование нескольких catch-инструкций 357 Перехват всех исключений 358 Вложение try-блоков 358 Генерирование исключений вручную 360 Повторное генерирование исключений 360 Использование блока finally 362 Исключения “под микроскопом” 363 Наиболее употребительные исключения 365 Наследование классов исключений 367 Перехват исключений производных классов 370 Использование ключевых слов checked и unchecked 372 Глава 14. Использование средств ввода-вывода 375 Организация C#-системы ввода-вывода 376 Байтовые и символьные потоки 376 Встроенные потоки 376 Классы потоков 377 Класс Stream 377 Байтовые классы потоков 378 Символьные классы потоков 378 Двоичные потоки 380 Консольный ввод-вывод данных 380 Считывание данных из консольного входного потока 380 Запись данных в консольный выходной поток 382 Класс FileStream и файловый ввод-вывод на побайтовой основе 383 Содержание 11 Как открыть и закрыть файл 383 Считывание байтов из объекта класса FileStream 385 Запись данных в файл 386 Использование класса FileStream для копирования файла 387 Файловый ввод-вывод с ориентацией на символы 389 Использование класса StreamWriter 389 Использование класса Stream Reader 391 Перенаправление стандартных потоков 392 Считывание и запись двоичных данных 394 Класс BinaryWriter 394 Класс BinaryReader 395 Демонстрация использования двоичного ввода-вывода 396 Файлы с произвольным доступом 400 Использование класса MemoryStream 402 Использование классов StringReader и StringWriter 404 Преобразование числовых строк во внутреннее представление 405 Глава 15. Делегаты и события 409 Делегаты 410 Многоадресная передача 413 Класс System. Delegate 415 Назначение делегатов 416 События 416 Пример события для многоадресной передачи 418 Сравнение методов экземпляров классов со статическими методами, используемыми в качестве обработчиков событий 419 Использование событийных средств доступа 421 Смешанные средства обработки событий 425 Рекомендации по обработке событий в среде .NET Framework 426 Использование встроенного делегата EventHandler 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 12 Содержание Использование оператора as 451 Использование оператора typeof 453 Отражение 454 Ядро подсистемы отображения: класс System.Type 454 Использование отражения 455 Получение информации о методах 455 Второй формат вызова метода GetMethods() 458 Вызов методов с помощью средства отражения 459 Получение конструкторов типа 462 Получение типов из компоновочных файлов 466 Полная автоматизация получения информации о типах 471 Атрибуты 474 Основы применения атрибутов 474 Создание атрибута 474 Присоединение атрибута 475 Получение атрибутов объекта 475 Сравнение позиционных и именованных параметров 477 Использование встроенных атрибутов 480 Атрибут Attribute Usage 480 Атрибут Conditional 481 Атрибут Obsolete 482 Глава 18. Опасный код, указатели и другие темы 484 Опасный код 485 Основы использования указателей 486 Объявление указателя 486 Операторы “*” и “&” 487 Использование ключевого слова unsafe 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. Библиотека C# 501 |