Пришла беда — отворяй ворота. В реальном мире данные, как пра-
вило, не хранятся маленькими кусочками. Данные приходят вагонами, шта-
белями и кучами. Для их систематизации нужны мощные инструменты, и тут
вам на помощь приходят коллекции. Они позволяют хранить, сортировать
и редактировать данные, которые обрабатывает программа. В результате вы
можете сосредоточиться на основной идее программирования, оставив за-
дачу отслеживания данных коллекциям.
Создать колоду карт можно было при помощи массива... 345
Дополнительные типы коллекций... 389
Сохрани массив байтов и спаси мир
Иногда настойчивость окупается.
Пока что все ваши программы жили недолго. Они запускались, некоторое вре-
мя работали и закрывались. Но этого недостаточно, когда имеешь дело с важ-
ной информацией. Вы должны уметь сохранять свою работу. В этой главе мы
поговорим о том, как записать данные в файл, а затем о том, как прочитать эту
информацию. Вы познакомитесь с потоковыми классами .NET и узнаете о тай-
нах шестнадцатеричной и двоичной систем счисления.
чтение и запись файлов
69 117 114 101 107 97 33
Для чтения и записи данных в .NET используются потоки 396
Различные потоки для различных данных 397
Объект FileStream 398
Трехшаговая процедура записи текста в файл 399
Чтение и запись при помощи двух объектов 403
Встроенные объекты для вызова стандартных окон диалога 407
Встроенные классы File и Directory 410
Открытие и сохранение файлов при помощи окон диалога 413
Интерфейс IDisposable 415
Операторы using как средство избежать системных ошибок 416
Запись файлов сопровождается принятием решений 422
Оператор switch 423
Чтение и запись информации о картах в файл 424
Чтение карт из файла 425
Сериализации подвергается не только сам объект... 429
Сериализация позволяет читать и записывать объект целиком 430
Сериализуем и десериализуем колоду карт 432
.NET использует Unicode для хранения символов и текста 435
Перемещение данных внутри массива байтов 436
Класс BinaryWriter 437
Чтение и запись сериализованных файлов вручную 439
Найдите отличия и отредактируйте файлы 440
Сложности работы с двоичными файлами 441
Программа для создания дампа 442
Достаточно StreamReader и StreamWriter 443
Чтение байтов из потока 444
Борьба с огнем надоедает
Программисты не должны уподобляться пожарным.
Вы усердно работали, штудировали технические руководства и наконец до-
стигли вершины: теперь вы главный программист. Но вам до сих пор продол-
жают звонить с работы по ночам, потому что программа упала или работает
неправильно. Ничто так не выбивает из колеи, как необходимость устранять
странные ошибки… но благодаря обработке исключений вы сможете напи-
сать код, который сам будет разбираться с возможными проблемами.
обработка исключений
Брайану нужны мобильные оправдания 450
Объект Exception 454
Код Брайана работает не так, как предполагалось 456
Исключения наследуют от объекта Exception 458
Работа с отладчиком 459
Поиск ошибки в приложении Excuse Manager с помощью
отладчика 460
А код все равно не работает... 463
Ключевые слова try и catch 465
Вызов сомнительного метода 466
Результаты применения ключевых слов try/catch 468
Ключевое слово finally 470
Получения информации о проблеме 475
Обработка исключений разных типов 476
Один класс создает исключение, другой его обрабатывает 477
Исключение OutOfHoney для пчел 478
Оператор using как комбинация
операторов try и finally 481
Избегаем исключений при помощи интерфейса IDisposable 482
Наихудший вариант блока catch 484
Временные решения 485
Краткие принципы обработки исключений 486
Наконец Брайан получил свой отдых... 489
Что делает код, когда вы на него не смотрите
события и делегаты
Невозможно все время контролировать созданные объекты.
Иногда что-то… происходит. И хотелось бы, чтобы объекты умели реагиро-
вать на происходящее. Здесь вам на помощь приходят события. Один объ-
ект их публикует, другие объекты на них подписываются, и система работает.
А для контроля подписчиков вам пригодится метод обратного вызова.
Хотите, что объекты научились думать сами? 492
Как объекты узнают, что произошло? 492
События 493
Один объект инициирует событие, другой реагирует на него 494
Обработка события 495
Соединим все вместе 496
Автоматическое создание обработчиков событий 500
Обобщенный EventHandler 506
Все формы используют события 507
Несколько обработчиков одного события 508
Связь между издателями и подписчиками 510
Делегат замещает методы 511
Делегаты в действии 512
Объект может подписаться на событие... 515
Обратный вызов 516
Обратный вызов как способ работы с делегатами 518
Знания, сила и построение приложений
обзор и предварительные результаты
Знания нужно применять на практике.
Пока вы не начнете писать работающий код, вряд ли можно быть уве-
ренным, что вы на самом деле усвоили сложные понятия C#. Сейчас мы
зай мемся применением на практике полученных ранее знаний. Кроме
того, вы найдете предварительные сведения о понятиях, которые будут
рассматриваться в следующих главах. Мы начнем построение действи-
тельно сложного приложения, чтобы закрепить ваши навыки.
Вы прошли долгий путь 526
Вы стали пчеловодом 527
Архитектура симулятора улья 528
Построение симулятора улья 529
Жизнь и смерть цветка 533
Класс Bee 534
Программисты против бездомных пчел 538
Для жизни улья нужен мед 538
Построение класса Hive 542
Метод Go() для улья 543
Все готово для класса World 544
Система, основанная на кадрах 545
Код для класса World 546
Поведение пчел 552
Основная форма 554
Получение статистики 555
Таймеры 556
Работа с группами пчел 564
Коллекция коллекционирует... ДАННЫЕ 565
LINQ упрощает работу с коллекциями и базами данных 567
Тестирование (вторая попытка) 568
Последние штрихи: Open и Save 569
Наводим красоту
элементы управления и графические фрагменты
Иногда управление графикой приходится брать в свои руки.
До этого момента визуальный аспект наших приложений был отдан на откуп
элементам управления. Но иногда этого недостаточно, например, если вы
хотите анимировать изображение. Вам предстоит научиться создавать свои
элементы управления для .NET, применять двойную буферизацию и даже
рисовать непосредственно на формах.
Элементы управления как средство взаимодействия
с программой 574
Элементы управления – это тоже объекты 575
Анимируем симулятор улья 576
Визуализатор 578
Формы для визуализации 579
Первый анимированный элемент управления 583
Базовый класс PictureBox 584
Кнопка добавления элемента BeeControl 586
Удаление дочерних элементов управления 587
Класс UserControl 588
Поместим на форму анимированных пчел 590
Формы Hive и Field 592
Построение визуализатора 593
Соединим основную форму с формами HiveForm и FieldForm 596
Проблемы с производительностью 600
Объект Graphics 602
Объект Bitmap 603
Пространство имен System.Drawing 604
Знакомство с GDI+ 605
Рисуем на форме 606
Решение проблемы с прозрачностью 611
Событие Paint 612
Перерисовка форм и элементов управления 615
Двойная буферизация 618
Вывод на печать 624
Окно предварительного просмотра и окно диалога Print 625
Метод завершения объекта 638
Когда запускает метод завершения объекта 639
Явное и неявное высвобождение ресурсов 640
Возможные проблемы 642
Сериализуем объект в методе Dispose() 643
Структура напоминает объект... 647
...но объектом не является 647
Значения копируются, а ссылки присваиваются 648
Структуры – это значимые, а объекты – ссылочные типы 649
Сравнение стека и кучи 651
Необязательные параметры 656
Типы, допускающие значение null 657
Типы, допускающие значение null, увеличивают робастность
программы 658
Что осталось от Великолепного 661
Сравнение 661
Методы расширения 662
Расширяем фундаментальный тип: string 664