
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .NET
- •Создание исходной программы
- •Тестовая поездка
- •Каркас программы
- •Комментарии
- •Введение в хитрости панели элементов
- •Повторное использование кода из панели элементов
- •Правила объявления переменных
- •Вариации на тему int
- •Объявление переменной с плавающей точкой
- •Ограничения переменных с плавающей точкой
- •Объявление переменных типа decimal
- •Сравнение десятичных и целых чисел, а также чисел с плавающей точкой
- •Логичен ли логический тип
- •Символьные типы
- •Что такое тип-значение
- •Неизменяемость строк
- •Основные операции над строками
- •Сравнение строк
- •Сравнение без учета регистра
- •Отличие строк в разных регистрах
- •Преобразование символов строки в символы верхнего или нижнего регистра
- •Поиск в строках
- •Как искать
- •Пуста ли строка
- •Удаление пробельных символов
- •Анализ числового ввода
- •Обработка последовательности чисел
- •Объединение массива строк в одну строку
- •Арифметика
- •Простейшие операторы
- •Порядок выполнения операторов
- •Оператор инкремента
- •Сравнение чисел с плавающей точкой
- •Составные логические операторы
- •Вычисление типа операции
- •Типы при присваивании
- •Перегрузка операторов
- •Ветвление с использованием if и switch
- •Инструкция if
- •Инструкция else
- •Как избежать else
- •Вложенные инструкции if
- •Конструкция switch
- •Циклы
- •Цикл без счетчика
- •Правила области видимости
- •Пример
- •Зачем нужны разные циклы
- •Зачем нужны массивы
- •Массив фиксированного размера
- •Массив переменного размера
- •Свойство Length
- •Инициализация массивов
- •Понятие <т>
- •Обобщенные коллекции
- •Инстанцирование пустого списка
- •Создание списка целых чисел
- •Преобразования списков в массивы и обратно
- •Подсчет количества элементов в списке
- •Поиск в списках
- •Инициализаторы массивов и коллекций
- •Выполнение специфичных для множеств задач
- •Создание множества
- •Добавление элемента в множество
- •Выполнение объединения
- •Пересечение множеств
- •Получение разности
- •Не используйте старые коллекции
- •Обход каталога файлов
- •Начало программы
- •Получение начальных входных данных
- •Создание списка файлов
- •Форматирование вывода
- •Вывод в шестнадцатеричном формате
- •Обход коллекций: итераторы
- •Доступ к коллекции: общая задача
- •Использование foreach
- •Формат индексатора
- •Блок итератора
- •Создание каркаса блока итератора
- •Итерирование дней в месяцах
- •Что же такое коллекция
- •Синтаксис итератора
- •Блоки итераторов произвольного вида и размера
- •Обобщенные классы безопасны
- •Обобщенные классы эффективны
- •Очередь с приоритетами
- •Распаковка пакета
- •Написание обобщенного кода
- •Использование простого необобщенного класса фабрики
- •Незавершенные дела
- •Ковариантность
- •Использование механизма исключений для сообщения об ошибках
- •Что происходит при генерации исключения
- •Исключительный пример
- •Что делает этот пример "исключительным"
- •Трассировка стека
- •Советы по написанию кода с хорошей обработкой ошибок
- •Анализ возможных исключений метода
- •Как выяснить, какие исключения генерируются теми или иными методами
- •Генерирующие исключения выражения
- •Работа с перечислениями
- •Создание перечислений с инициализаторами
- •Указание типа данных перечисления
- •Применение перечислений в конструкции switch
- •Процедурные поездки
- •Объектно-ориентированные поездки
- •Определение класса и объекта
- •Определение класса
- •Что такое объект
- •Различие между объектами
- •Работа со ссылками
- •Классы, содержащие классы
- •Определение константных членов-данных и членов-данных только для чтения
- •Передача аргументов методу
- •Передача методу нескольких аргументов
- •Соответствие определений аргументов их использованию
- •Перегрузка методов
- •Реализация аргументов по умолчанию
- •Возврат значения оператором return
- •Кортеж с двумя элементами
- •Создание кортежей более чем с двумя элементами
- •Глава 14 Поговорим об этом
- •Определение методов
- •Определение статического метода
- •Определение метода экземпляра
- •Полное имя метода
- •Ключевое слово this
- •Когда this используется явно
- •Что делать при отсутствии this
- •Использование локальных функций
- •Прочие уровни безопасности
- •Методы доступа
- •Пример управления доступом
- •Выводы
- •Статические свойства
- •Побочные действия свойств
- •Дайте компилятору написать свойства для вас
- •Методы и уровни доступа
- •Замена конструктора по умолчанию
- •Конструирование объектов
- •Непосредственная инициализация объекта
- •Конструирование с инициализаторами
- •Инициализация объекта без конструктора
- •Определение свойств с кодом
- •Определение конструкторов и деструкторов с кодом
- •Определение методов доступа к свойствам с кодом
- •Определение методов доступа к событиям с кодом
- •Наследование класса
- •Более сложный пример наследования
- •ЯВЛЯЕТСЯ или СОДЕРЖИТ
- •Доступ к BankAccount через содержание
- •Отношение СОДЕРЖИТ
- •Заменяемость классов
- •Неверное преобразование времени выполнения
- •Указание конкретного конструктора базового класса
- •Обновленный класс BankAccount
- •Перегрузка унаследованного метода
- •Простейший случай перегрузки метода
- •Различные классы, различные методы
- •Сокрытие метода базового класса
- •Вызов методов базового класса
- •Что неверно в стратегии использования объявленного типа
- •Использование is для полиморфного доступа к скрытому методу
- •Объявление метода виртуальным и перекрытие
- •Получение максимальной выгоды от полиморфизма
- •Разложение классов
- •Абстрактный класс: ничего, кроме идеи
- •Как использовать абстрактные классы
- •Создание абстрактных объектов невозможно
- •Опечатывание класса
- •Реализация интерфейса
- •Именование интерфейсов
- •Наследование и реализация интерфейса
- •Преимущества интерфейсов
- •Тип, возвращаемый методом
- •Что скрыто за интерфейсом
- •Гибкие зависимости через интерфейсы
- •Реализация отношения СОДЕРЖИТ с помощью интерфейсов
- •Определение делегата
- •Пример передачи кода
- •Делегирование задания
- •Очень простой первый пример
- •Более реальный пример
- •Создание приложения
- •Жизненный цикл делегата
- •Анонимные методы
- •Проектный шаблон Observer
- •Что такое событие. Публикация и подписка
- •Как издатель оповещает о своих событиях
- •Как подписаться на событие
- •Как опубликовать событие
- •Как наблюдатели "обрабатывают" событие
- •Сборки
- •Выполнимые файлы
- •Библиотеки классов
- •Создание проекта библиотеки классов
- •Создание автономной библиотеки классов
- •Создание классов для библиотеки
- •Использование тестового приложения
- •Дополнительные ключевые слова для управления доступом
- •protected: поделимся с подклассами
- •protected internal: более изощренная защита
- •Размещение классов в пространствах имен
- •Объявление пространств имен
- •Пространства имен и доступ
- •Использование полностью квалифицированных имен
- •Ссылочные типы
- •Выходные параметры
- •Альтернативные методы возврата значений
- •Работа с переменными out
- •Возврат значений по ссылке
- •Различия типов-значений
- •Когда следует использовать структуры
- •Добавление распространенных элементов структур
- •Управление отдельной записью
- •Добавление структур в массивы
- •Перекрытие методов
- •Определение того, что следует защищать
- •Документирование компонентов программы
- •Разложение компонентов на функции
- •Оценка рисков
- •Аутентификация с использованием входа в Windows
- •Безопасность развертывания
- •Уязвимости сценариев
- •Наилучшие методы защиты приложений Web Forms
- •Получение данных
- •Настройка образца схемы базы данных
- •Подключение к источнику данных
- •Работа с визуальными инструментами
- •Написание кода для работы с данными
- •Использование Entity Framework
- •Где водится рыба: файловые потоки
- •Потоки
- •Читатели и писатели
- •Пример использования потока
- •Как это работает
- •Наконец-то мы пишем!
- •Использование конструкции using
- •Загрузка файла из Интернета
- •Регистрация сетевой активности
- •Графика
- •Перья
- •Кисти
- •Текст
- •Классы рисования и каркас .NET
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

Наконец-то мы пишем!
После настройки StreamWriter программа FileWri te считывает входные строки с консоли (этот код находится в методе WriteFileFromConsole ( ) , вы зываемом из метода Main ( ) ). Программа завершает работу после ввода пользо вателем пустой строки, но до этого все введенное пользователем выводится в файл при помощи метода WriteLine ( ) класса StreamWriter. И наконец поток закрывается с помощью вызова sw. Close ( ) . Это весьма важное действие, по скольку оно закрывает и файл.
Обратите внимание на то, что программа обнуляет ссылку sw по за крытии StreamWriter. Файловый объект становится бесполезным после того, как файл закрыт. Правила хорошего тона требуют об
СОВЕТ нулять ссылки после того, как они становятся недействительными, так, чтобы обращений к ним больше не было (если вы попытаетесь это сделать, то будет сгенерировано исключение). Закрытие файла и обнуление ссылки позволяет сборщику мусора подобрать ненужную более память, а другим программам - открывать закрытый файл.
Блок catch напоминает футбольного вратаря: он стоит здесь для того, что бы ловить все исключения, которые могут быть сгенерированы в программе. Он выводит сообщение об ошибке, включая имя вызвавшего ее файла. Однако выводится не просто имя файла, а его полное имя, включая путь к нему. Это делается посредством класса Directory, который позволяет получить текущий каталог и добавить его перед введенным именем файла с использованием мето да Path . ComЬine ( ) (Path - класс, разработанный для работы с информацией о путях, а Directory предоставляет свойства и методы для работы с каталогами).
техничЕскиЕ |
Метод ComЬine ( ) достаточно интеллектуален, чтобы разобраться, |
подРОБности |
что для файла наподобие с : \test . txt Path ( ) не является текущим |
|
каталогом. Path . ComЬine ( ) представляет также наиболее безопас |
ный путь, гарантирующий корректное объединение двух частей пути, включая символ-разделитель (\) между ними.
В Windows символ-разделитель пути - \, но можно использовать и сим вол-разделитель Linux - /. Вы можете получить корректный разделитель для
операционной системы, под управлением которой запущена программа, с по мощью Path . DirectorySeparatorChar. Библиотека .NET Framework изобилу
ет такого рода возможностями, существенно облегчая программистам на С# написание программ, которые должны работать под управлением нескольких операционных систем.
(омом , F бeчиoьи мкеяеьр ррn

D - это полное имя каталога. Например, если имя файла - с : \ user\directory\text . txt, то его путь - с : \user\directory.
ЗАПОМНИ!
Достигнув конца цикла while, либо после выполнения trу-блока, либо по сле блока catch, программа возвращается к началу цикла м,позволяет поль зователю записать другой файл. Вот как выглядит пример выполнения де монстрационной программы (пользовательский ввод выделен полужирным шрифтом).
|
|
|
П |
|
|
CЬ аеионале# e о,ож |
|
|
|
о |
n |
|
|
C |
|
cд mд |
|
|
|
|
|
|
|
-ln |
ь ь ь n |
|
|
|
|
||
лnдn |
|
|
|
|
|||
|
|
|
n |
|
З:: r,eх : |
тН аеионале) |
Т о,ож |
K4, |
.:в , |
|
п lЗпр,шс1х" |
,З' :имЗ",' 1 ЗB, |
::в ,r . |
||
щвх,щ, , : |
. |
|
|
|
|||
|
|
|
n |
|
|
тН аеионалеВ а R ож |
|
|
|
|
н |
|
|
C |
|
сxerж |
= , |
ожзмьсж eЖ сж ббодwж |
|
|
|||
Нж |
Tмомж |
аеионалеВ ьж |
|
|
|
|
|
|
(,кт |
н |
|
|
C р |
|
|
|
,хS |
|
|
й й . |
|
Все отлично работает, пока некоторый текст вводится в файл TestFilel . txt. Но при попытке открыть файл TestFilel . txt заново программа выводит сообщение The file already exists (файл уже существует). Обратите вни мание на полный путь к файлу, выводимый вместе с сообщением об ошибке. Если исправить ошибку и ввести имя TestFile2 . txt, все продолжает отлично работать.
Использование конструкции using
Теперь, когда вы увидели FileStream и StreamWriter в действии, я должен указать на более обычный путь записи потоков в С# - в конструкции using:
ниавт еcзе ю,МЧж |
Ад<дсъж |
ц ц ] , 4, х, |
с х(,й |
Конструкция using автоматизирует процесс освобождения ресурсов по сле использования потока. Когда С# встречает закрывающую фигурную скобку блока using, он "сбрасывает" поток и закрывает его. t1 4 лn потока
ii o, ЧАСТЬ 3 т" M % "Bo M %".рJ, % " . ( " , p "( С#

=
=
=
= |
|
|
|
==+= |
==+ =+= =+=+ =+ += == =+=+= = |
=+=+=+ |
==+ |
=+ =+==+= |
= = = = =+==+ =+=+=+ =+==++= |
===+=+=+===+ |
===+=+=+= +====+====+=+====+==+==+
=+===+=== =+= |
|
|
|
|
|
=+ +=+ =++ += +==+ |
||||
=+= =+==== |
=+==+== |
===+===+=+=+=+= =+==+ = |
+= = |
|||||||
=+=+== =+=+=+===+ |
|
=+==+== |
=== |
==+==+ |
=+==+=+==+= |
= |
||||
=== |
+=+=+=+==+=+ |
|
= |
==+=+=+=+ |
|
|
|
|||
|
= |
|
|
|
|
|
|
|
|
|
<+== |
++= =+++=< |
=+ |
=+ |
=+++= |
<= |
|
|
|||
= |
|
|
|
|
|
|
|
|
|
|
|
< = |
=== == |
= |
= |
= = <+== === |
|
|
|||
|
==== |
==== |
= |
= |
= |
= |
= |
= == |
|
|
|
|
= = |
|
|
= |
= |
|
|
||
= |
|
|
|
|
|
|
|
|
|
|
=
==
=
ГЛАВА 25 Рыбалка в потоке 553

)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
ОСТИ"s ПВИЕСНМАПCММЧТЕХ,Рe ИДБ!!БДСЕБ СМП!ВЕ. |
Е!И СНВЕСВ ВСНД!Д!БДС |
||||||||||||
|
!ВПe!НИМАРВЗ!eЕСН !М! МЕВЕСМtПeПМЗ!ВП НПТЕХМ!МЗ!ВП ЕДСВ!ed - |
Дe |
||||||||||||
|
НДЕД"'JИСДВСНД!Д!ДИ"'JСД! |
З!ВПД !П! РМeБ Д'В Кe'В!В! |
ВП !ИД З!ВПe |
|||||||||||
ЗАПОМНИ! |
ИДЕМА СДЕ!МАРС eПИЕВЗНeКВЕt СДНДЕДИИeБТЕХСМСr eЧНПОИaЧП, НОП |
|||||||||||||
|
ИД!М!МЕe !"'JДЗ!ВПe ВТЕХ,Рe,n Е!З!eЕСМ !М!МЕВЕСМ НeЕЕЕeСНМ!e!МЕВ ! |
|||||||||||||
|
МeЕСМ..Е!ЕИВ!ССНВ'НeЕЕМНВ!eИМБ Иe А, |
|
Т |
|
|
|
|
|
||||||
.. СНМ!Д!ДИИВЕ СНМЕДНД! |
НeК!Д!Д Кe |
!eСeНДЕМАНЕВ!!ССВ!ИБРСЕБ |
!ДЗП |
|||||||||||
ЕС!МБ СВ ИeЕСНВЗПДНДЕМАНЕВ! |
! |
"'JeТДЕ |
Е!МАМeДЕВК!eДСЕБ ИВ!СЗ |
ВЗ |
ДПС |
|||||||||
ЧНПОИaЧ П,0!g ! ВЗДНИМАС З!ВПНМА'МА!ДЕМА |
ДЕС!МАР |
|
"ДРО'В !ОЧНПОИa, .. |
З!ВПД |
||||||||||
!ССВ!"'J БРС ЕБ !ЕД !ДЗЕС!МБ !В !!A!МА |
!А!!ВМА! !eЗ!ТЕХ |
|
|
|
|
|
|
|
||||||
.. ПВ"'JCДЗ!ВПe ВТЕХ, e |
e! СВЕeСММДЕПМЕЗНВЕМСЧESl'SПОИaЧПРОНОПКeПНВДСД'В М |
|||||||||||||
"РО!ОЧНП!Иa МЕЗНВЕМС!ЕД ЗeЗСС МКСeЕБСМИe !МЕПТЕХHВ .СВ Д |
ИД!ЕД b |
ВПВИe |
||||||||||||
МeИМДЗ!ВПe ЧТЕХ!РСoПНВЕДСВ'В " |
c"ю" |
П,1. ВЗbДПСЧНПОИaЧПРОНОПc |
|
|
||||||||||
|
neЗВСМАЕ СВСВПeЕММЕДДСЕЕСЕ! |
!ЕД'!e НeКЕД |
eСВ! |
З!ВПД ПВИЕСНМАП |
||||||||||
|
CММВТЕХРОРe- eПНe'ТЕХЕД |
ДИМД! .СВЕ З!ВПД ВЗbДПСВ! ЧНПОИaЧП,НОПМ!М |
||||||||||||
|
ЧНП!Иa !И,!g |
!ДЗЕС!МА |
ССeП !Дt |
ПeП М НeКЕД |
ДИМДМЕСВ!ВКВ!eИМБ |
|||||||||
СОВЕТ |
СМЕeСД!БМ!М |
СМeСД!Б ! |
З!ВПД ВЗНeЗВСПММЕП!РМДИМЗНПТЕХ dРОРИ!eТЕХ, |
|||||||||||
|
eПСММДЕПМПВЕСМ!БСВAСНeИЕ!МНМАДСЗ!ВП ЧТЕХРОР! Сee |
З!Д ПВ!t ПeП |
||||||||||||
|
МСНМСНeИЕ!БCММНП |
|
РОРИТeМСВ'eНeИСМНМАДСПВННД ИВДВЕ!ВЗВe |
|||||||||||
|
!!ДИМД !ЕД 'ТЕХe МД!e"'JИАНДЕМАНЕВ!p |
|
|
|
|
|
|
|
554 ЧАСТЬ 3 Вопросы проектирования на С#

|
|
!И1131!ОЗ! !!АЕ!! |
,! ?!З Е!!О!З |
,!! ВО |
!В?АПО! |
!? !Е!? |
|||||||
|
|
П |
|
|
,! ! ,!З ПМН!О1131!Е!!!?О ВМН!Е!?О |
?!И!?!Е!ОИЗ |
|||||||
|
|
|
АПВ! ! ! ВО |
!В?АПО!?АПИ1131!ЗИ!,!!!З |
|||||||||
ВНИМАНИЕ! В!ПЗ!, АП,!Е!!,В?1131ОЕ! |
!!,! |
,! З!?О Е!!Е!АПИ1131!,,!ААП!З! |
|||||||||||
|
|
1131! |
А!,?! |
|
|
|
|
|
|
|
|
||
|
З,!Е!!ВО1131!П Е!1131В И ВИ!?!?!!ЗМНВО1131!ВИАП!Е!1131!!?ВИ!АП!!? З ВЗ! |
||||||||||||
АПИ!ИИ?!!?!В АПИИ!З,МН!И?!1131!ВИ!З!!Е!!А?! И!ЗО !?!ВЕ!З |
!,!! |
!З |
|||||||||||
ВМН |
!!ЗАПИ! ,! А! !?!1131!ВОП!?!?Е!1131ОИ?!ИА!А О1131!?!АП,!АЗ!,!! |
,! |
|||||||||||
?! |
|
?!АПЕ!!З! |
|
|
1131!,!!АП З!А1131!МНПЗ!О!,ОЗМНЗ! !О !Е!? И!ВЗ!ОЗ!Е!! |
||||||||
|
|
!ОИ!1131!,?!1131!,!АП ПА АП,!В??И!АП?!1131,!ВИ З !П!АП!,!МН ! |
|||||||||||
ВЗ! ?! !О |
!Е!? |
И!1131!ВОЗ!!?!1131ВМН АОВ!!1131!Е О |
|
!!?В?АП!АП!? |
|||||||||
|
!,! ,! |
! |
! ЗЕ!!?!1131АПИИ!И!В!З!,! З!ВЕ!И1131!ЗВО!З |
||||||||||
|
ВЗ!АП!,!З! |
ООЗ!?1131!ОВ,!!?!?А ! ! 1131ЗЗМН?! |
ВЗ! !ЗО!?В!ПЗ!? ! |
!? |
|||||||||
Е!1131,!АПИ? ! З!АПИ!З!Е! |
|
|
|
|
|
|
|
|
|||||
|
|
!,В?1131ОЕ! !О!МН!ВИ! !АП!!?ВАП!О! З!,!!1131!ВОЗЗМН1131!О В!А |
|||||||||||
|
|
!Е!?!АПЕ!!?!113131!!И З!ПО,?!1131 ! В |
|
!О!,?!1131 ! В! |
|||||||||
|
|
1131!ВВЕ!!ПИАП!В!!?!ВМН |
О !Е!?,! !1131!!,?!11131!И АП!,,!!1 |
||||||||||
|
|
А!1131!,!АП!,!! |
!,В?1131ОЕ! !МН!1131!,?!1131АПИПААП!?!ОЗ!? |
||||||||||
|
|
|
|
!О |
!Е!?! З!ВВИЕ!!?!113131!!И З!ПО |
? |
|
|
!1131!, |
||||
|
|
?!1131!!АП!!,,!??!Е!! А!?!З |
,?!1131 |
! В |
|
АП!В,!АП,!А |
|||||||
|
|
И1131!З,! ЗЗМН,! !ВАП!, !О! З!,!1131!МН ВО,! 1131МНАПЗМНВ!АП1131!ВМНВО11 |
|||||||||||
|
|
|
|
З!АП,ИА!О113113ВО!П!А1131! АП,!В!,!АПА! !1131!И!1131! !!,,! |
|||||||||
|
|
В!В?!АИ |
?!Е!! Е!!Е!З!ВЕ1131!И?!1131!З АП И1131! ! !В |
||||||||||
|
|
1131!ВО!И11131!ЕВИЗАВВ!1131 И1131!ЗВВ?!АПЗМНО! О!1131?!?Е! |
|||||||||||
|
|
АП!Е!1131! З АПО! З!ВЕ!1131!И?!1131!Е!!?!1131З З И!, ОИ?!ВАП! |
|||||||||||
|
|
О! |
З!, |
,?!1131 |
! В |
1131!!ЗА!ПО,! !?В?АПЕ!З!ВВ!АП! |
|||||||
|
|
В?1131АПОЕ! !?В!О!ОВ1131?АП!,,ИЕ!!З!ВВИ?!Е! А! ! О? ?!З!З!? |
|
|
|||||||||
|
|
?! Е!,! |
!МН,! ООЗО ЗООЗМНАПЗ?!ОВМН1131!!,?!1131 |
! В! |
|
,! |
|||||||
И! А!1131!И ЗО !,!МН!ИИ?!1131!ВО!?АПИ!ОМНП!?!ЗЗ!,!З ,ИИ!ОЗ! !В,!А |
|||||||||||||
И!П,!Е!!А!? ВМН!1131113131!!Е!?,!МНЗ!П1131!! ОВ,!?!!?З!?!1131А!,!1131!АП |
|||||||||||||
ВО!1131АОВЕ!1131!!А ?ОИ?АП!В ВЗА!! |
,! |
!,В?1131ОЕ! !ВИ!МН!З ПО |
|||||||||||
!?ВМНЕ!З!ВВ!А! ! В?1131ОЕЕ!!?!О113131!!ИА!! З!ПО,?!1131 ! В |
|
||||||||||||
1131!!ЗЗ!!ПОЕ!!,?Е!1131Е!?,З!ИВВ ?!?!,?!1131А!! ,!ВОП,!? !П ВИ1131!АП! |
|||||||||||||
В!В?! И |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
?Е! Рыбалка в потоке |
чччt |

Исr : |
|
|
в |
|
|
.,,,Д |
|
StreamReacierhф |
|
|
|
||||||
|
|
|
. |
ан |
|
е |
|
J |
|
,ж |
|
. |
|
|
|
||
пользо |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
л' |
,'l1)- |
J',з,' |
|
И ,"1,# |
|
1)B |
1:»,_"1"1n |
,# |
1)#,"1),(:"1,,# |
,:"11),#,"1:,#"1n |
"11), 'l ,, |
,"1 ,#o |
|||||
1"1B"1 |
,#:1"1 |
,),(#e"11)B- |
:', 'l1)',,#"1 |
i),('l ,"1,"1 |
,,' |
, ,'l |
1"1 ,"1,#,1)B),('JJ'l#,,', |
,),(# |
|||||||||
.),(',,' |
|
(1Y1"1"1#,В |
1)e'lB, |
,'"1B |
B"1,1)B#,п,з J',з,n |
,',),('l,"1),(n |
1)#:, ',,,,з |
,"1,#, |
1),s),(' |
||||||||
JJ'l#,,#,з |
_),(#.),(', |
|
,#,з |
|
(1Y1"1a,( ),("1 'l,'l |
,),(#.),(', |
,#,з |
,#,,#Bn B_"1 с:),("1 #,:),(' |
"1, ,', |
||||||||
,),(# . ),(',,' |
1Y1"1a,(),("1( |
r:',"1e. |
neB# , |
,"1,з , ),("1:'l, |
,"1 |
'l1) ,#, |
-:#,'B- |
,#,1)B),(. |
,JJ'l 1 |
||||||||
-, ( |
,Г |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
l1
В |
ц |
, ,
В щ
Вц
В |
щ |
В , |
, |
щ |
ААд ЧАСТЬ 3 l ожаойнижаодгтв аотрСвеи Срииси


Вспомните, что текущий каталог, используемый программой
FileRead, - это подкаталог \Ьin\Debug в проекте FileRead (не под каталог \Ьin\Debug в каталоге программы FileWrite, где создавал ся файл, записываемый этой программой FileWrite в предыдущем разделе). Перед тем как запустить программу FileRead для проверки ее работоспособности, поместите любой обычный текстовый файл (с расширением . хшхов nподкаталог \bin\ Debug каталога Fi leRead и запомните его имя, чтобы вы могли его открыть. Для этого впол не подойдет копия файла TestFilel . txt, созданного программой
FileWrite.
В программе FileRead пользователь читает один и только один файл. Пользо ватель может ввести корректное имя файла для вывода (второго шанса не дано). После того как программа прочтет файл, она завершает свою работу. Если поль зователь хочет выбрать второй файл, он должен перезапустить программу. Вы, конечно же, можете организовать работу своей программы совершенно иначе.
Весь серьезный код программы помещен в обработчик исключений . В t rу-блоке вызываются два метода: сначала - для получения объекта StreamReader для файла, а затем - для чтения файла и вывода его содержимо го на консоль. В случае генерации исключения саtсh-блок выводит сообщение об исключении. Наконец, независимо от того, генерируется исключение или нет, блок finally обеспечивает закрытие потока и его файла и обнуление пе ременой sr для того, чтобы сборщик мусора мог освободить неиспользуемую более память (см. часть 2, "Объектно-ориентированное программирование на С#"). Исключения ввода-вывода могут быть сгенерированы в обоих методах, вызываемых в trу-блоке. Эти исключения в поисках обработчика доходят до метода Main ( ) (обработчики исключений в самих этих методах не нужны).
Обратите внимание на комментарий //T0D0 : в саtсh-блоке. Это на поминание о том, что сообщение следует сделать более понятным
для пользователя перед тем, как окончательно выпускать программу.
СОВЕТ
558 ЧАСТЬ 3 Вопросы проектирования на С#


Блок catch в методе Main ( ) требуется для того, чтобы сгенерированное исключение не привело к аварийному останову программы. Если программа генерирует исключение, саtсh-блок выводит сообщение и просто игнорирует ошибку. Этот блок catch позволяет пользователю узнать, что же произошло, и предупреждает аварийное завершение программы из-за необработанного ис ключения. Можно переписать программу таким образом, чтобы у пользователя запрашивалось другое имя файла, но данная программа настолько мала, что это не имеет смысла - проще запустить ее заново.
Наличие обработчика исключения, который просто перехватывает ошибку, предохраняет программу от аварийного завершения из-за мелкой неприятности. Однако этот метод можно использовать, толь СОВЕТ ко если ошибка действительно некритична и не вредит работе про
граммы.
Вот как выглядит пример вывода программы:
|
щ |
шаI- |
=t- к |
т к |
пр r, имр -: им, -:u, о э аИэщ,хр1 хщг И::r,1,ш, ЗD, |
::r, . |
|||
(,им |
,хS |
O к O |
|
|
|
щ |
рI- ш |
=Pt,гк |
|
|
а |
|
|
|
|
Ь |
|
|
|
к к к |
к . к |
|
|
|
(,й |
,х[ |
|
|
Пример чтения произвольных rы,ьт.ы из файла (который может быть как текстовым, так и бинарным) показан в программе LoopThroughFiles в главе 7, "Работа с коллекциями". Программа циклически просматривает все файлы в целевом каталоге, читая каждый файл и выводя его содержимое на консоль; очевидно, что она быстро становится утомительной при наличии большого количества файлов. Не стесняйтесь прекратить ее работу нажатием клавиш <Ctrl+C> или щелчком на кнопке закрытия окна консоли. Смотрите обсужде ние BinaryReader в следующем разделе.
Еще о
читателях, 2 6 3т
и писателях
Ранее в этой главе я показал вам классы StreamReader и StreamWriter, ко торые, пожалуй, способны удовлетворить подавляющее большинство ваших нужд в файловых операциях ввода-вывода. Однако библиотека .NET предлага ет ряд других пар "читатель-писатель".
560 ЧАСТЬ 3 Вопросы проектирования на С#

>>BinaryReader/BinaryWriter - пара потоковых классов, которые содержат методы для чтения и записи каждого из типов-значений: ReadChar ( ) , WriteChar ( ) , ReadByte ( ) , WriteByte ( ) и т.д. Эти классы полезны для чтения и записи объекта в бинарном (не читае мом человеком) формате, в противоположность текстовому форма ту. Для работы с бинарными данными можно использовать массив или коллекцию байтов.
Эксперимент: откройте в программе Блокнот файл с расширени ем . ЕХЕ. В окне вы можете увидеть читаемые фрагменты текста, но большая часть файла будет выглядеть мусором. Это и есть бинарные данные.
Вглаве 7, "Работа с коллекциями'; имеется упомянутый ранее при мер, который читает бинарные данные. В этом примере Bina ryReader с объектом FileStream испол ьзуется для чтения бло ков байтов из файла с последующим выводом на консоль в шест надцатеричной записи. Несмотря на то что пример оборачивает Fi leStream в более удобный BinaryReader, в этом примере с таким же успехом можно было бы использовать FileStream непо средственно.
--» StringReader/StringWriter - простые потоковые классы, ко торые ограничены чтением и записью строк. Они позволяют рас сматривать строку как файл, предоставляя альтернативу доступу к символам строк с помощью записи с использованием квадратных скобок ( [ ] }, цикла foreach или методов класса String наподобие
Split ( ) , Concatenate ( ) и IndexOf ( ) . Вы считываете и записыва ете строки почти так же, как и файлы. Этот метод полезен для длин-
'ных строк с сотнями или тысячами символов (например, полностью считанный в строку текстовый файл), которые вы хотите обрабо тать вместе. Методы в этих классах аналогичны методам классов
StreamReader и StreamWriter, описываемым далее.
При создании объекта типа StringReader вы инициализируете его строкой для чтения. При создании объекта StringWriter ему либо передается существующий объект типа StringBuilder, либо соз дается пустой объект такого типа. Получить содержимое внутрен него объекта StringBui lder можно при помощи вызова метода
ToString ( ) класса StringWriter.
Всякий раз при чтении из строки (или записи в нее) "указатель поло жения в файле" перемещается к следующему символу. Таким обра зом, как и при файловом вводе-выводе, здесь используется понятие "текущая позиция". При чтении 1 О символов из тысячесимвольной строки указатель после чтения окажется указывающим на одиннад цатый символ.
ГЛАВА 25 Рыбалка в потоке 561

Методы этих классов аналогичны описанным методам классов
StreamReader и StreamWriter. Если вы применяли их там, то мо жете использовать и здесь.
Друг виды пот ко,в
В завершение я должен упомянуть, что файловые потоки - не единствен ный доступный вид подклассов Stream. Поток подклассов Stream включает (но не ограничивается ими) классы из приведенного далее списка. Если явно не указано иное, классы находятся в пространстве имен System . IO.
ТЕХНИЧЕСКИЕ nh!rhМehАТЕХ
))' |
ыыСнвМжнtcтгСчитывает и записывает файлы на диск. |
)) |
чнcd жaвМжнtcогУправляет чтением и записью данных в блоки па |
|
мяти. Этот метод иногда применяется при тестировании, чтобы из |
|
бежать медленной и беспокойной работы с диском, подменив дис |
)) |
ковый файл "обманкой" в памяти. |
лхSSнжн.вМжнt cагБуферизация представляет собой метод ускоре |
|
|
ния операций ввода-вывода путем считывания или записи больших |
|
блоков данных за один раз. Много операций чтения или записи ма |
|
лого размера означают большое количество медленных обраще |
|
ний к диску. Вместо них можно считывать в буфер сразу большие |
|
блоки данных, а уже затем выбирать отдельные байты из буфера, |
|
что будет существенно быстрее работы с диском. Когда в буфере |
|
BufferedStream данные исчерпываются, он считывает новую пор |
|
цию данных, вплоть до всего файла целиком. Буферизация записи |
|
выполняется аналогично. |
|
Класс FileStream автоматически буферизует свои операции, так |
|
что BufferedStream предназначается для особых случаев на |
|
подобие работы с NetworkStream, который читает и пишет бай |
|
ты по сети. В этом случае BufferedStream обертывается вокруг |
|
NetworkStream, и когда вы пишете данные в BufferedStream, они |
|
записываются в обернутый NetworkStream. |
)) шнМдdжывМжнtcогУправляет чтением и записью данных по сети. Класс NetworkStream находится в пространстве имен System. Net . Sockets, поскольку для соединения по сети он использует сокеты.
)) |
eDctDtн)нcd |
жaв МжнtcйгПозволяет читать и писать данные в |
|
"неуправляемые" блоки памяти. Под неуправляемостью в данном |
|
|
случае подразумевается отсутствие управления со стороны .NET и |
|
)) |
сборщика мусора. |
|
нвМdвМ жнрогНаходится в пространстве имен System. Security. |
||
|
Cryptography. Этот класс потока предназначен для передачи дан |
|
|
ных с шифрованием. |
562 ЧАСТЬ 3 Вопросы проектирования на С#

До сту п к И н те р н ету
В ЭТО Й ГЛА В Е . . .
)) Экскурс111я п.Р пространству имен System. Net )) J стрренны. :11 нструм,ент. для работь,.с с тьfО
ар)) -Р бота с 'сетевьiми инструментами
ричиной, по которой M icrosoft пришлось создавать .NET Framework, было отсутствие в существующей инфраструктуре возможностей для взаимодействия с Интернетом. Объектная модель компонентов
(Component Object Model - СОМ) просто не в состоянии работать с Интер нетом. Интернет работает не так, как большинство платформ, таких как пер сональные компьютеры. Интернет построен на протоколах - точно опреде ленных и согласованных способах обеспечения работы таких средств, как электронная почта и передача файлов. Среда Microsoft до 2002 года явно не справлялась с этим.
Как вы могли видеть в этой книге, каркас .NET изначально разрабатывался с учетом Интернета и сетей в целом. Не удивительно, что это особенно ярко вид но в пространстве имен System . Net. Здесь первое место занимает Интернет, а веб-инструменты представлены девятью классами в этом пространстве имен.
В версии .NET 4.7 (которая поставляется вместе с Visual Studio 20 l 7) добав лено еще больше функциональных возможностей для работы с Интернетом. Хотя в версиях н д основное внимание уделялось инструментам, используе мым для создания других инструментов (низкоуровневых функций), теперь каркас содержит полезные функции, такие как веб, электронная почта и FTP.

S ys t em . Net - ..Mmo.. .,...,i(..--. |
%-.(В..%.------...,.-.B.. ...m |
|||||
.,..(.- н ф..3 |
гMi--....B. .iJ... |
Si |
... --...M(..- |
.. гi.iS% |
% ..--iгi(. |
|
..(.--. ,i.... . |
(..,(...-л |
i...i --...% ....i--M... |
..Mmo J |
Si..m |
v |
|
н кт % --....--..ы ....--.J |
%s.(--n%.(i m(.. --.г-.B(...%(ia...... |
|
||||
--. -iгi((.-.,...,i(..--. %-.(яыi ф.. |
..-. -.B.. ...m |
й%..Miа |
(i.%.i(i |
(. |
||
..(i --(%нгi--iS...--.----.....(%. -.. --.г-.B(...%Ве --ф..3 |
гMi--.,.. . |
|||||
..i--M.(. .M...J |
%. s.(--n%% |
|
|
|
|
|
>>получение файлов из сети;
>>отправка электронной почты;
>>регистрация пересылаемой информации;
>>проверка состояния сетевого окружения вашего приложения.
nсужпу в вилы апб обмупт и ank мпмги лрыриуобврусуннту дрбпбмбрт nнc пурнулп. лбопппбанб впинт. нб ебрмeинопвб рпtрпебпаимбв в нпопбяяуу вруся ну иодбрмtыйп ив мпилтж лунм. а спбж ррпву рпоомпtтвпупоя б пув апопяв дрбc опрпнопвп исунг мбпбрту вт еылупуиодбрмtбвппмв уиулнувнбж рпебпуАaпм апб.
мпми в рйебж пусу спбж мнири u |
исуупоя ебрмeбу хриауопвб инкбрсп.ии б |
дрбопрпнопву исун System . Net, (. |
..--. .((.3 г...mл |
. |
V1Ma |
S |
|
|
-.. --.. %l,--. "l |
|
|
|
|||
|
|
gi3al gl |
|
|
i ерПе |
|
|
|
|||
|
О g |
|
|
ПП --д |
пh О рд |
ер, |
|
|
|
|
|
|
П,...,i(..--. |
%-.( Sys tem . Net |
....,B%. |
-(.B...--.--Mi...--.к..., -. |
|
||||||
г.. |
.-..%.m |
(.г,.M.г. |
.,.г,i--%..i |
.--.%--.M%S...--.,% .-.,..-..,. .. |
|
||||||
--.-.(.in%%(.п --...,.. %-.J. ..Mmo.3 |
.-..M |
.,% %...Mmг.--i(%%--.,%M. |
|
||||||||
B.(%%v П,...,i(..--. |
%-.( ... |
,i(... |
--.M.J.B(... |
m ,i.... |
. ,iгM%S(.-% |
|
|||||
.,...--.Mi-%%п...Mmг.. |
-.-% --(.. ,(... |
|
|
|
|
||||||
|
В. ...--... |
..M.. |
Пззз |
.M. |
.,...--.M.--(..,(..i |
й й |
|
югi.,.. --.--.(.i,%..,--....i -а M... ....3 ..--.-.--(.п ...,.3..
.,i--M..... |
--.,гi( |
.. ..i(.i,.%гin%% |
.M. |
.,.--.,----% .MM.гi-.,.B%.. S.- |
|||
.( |
..i(.. |
..i(.i,.. |
-а |
.M%--(.iB(-. |
%г.S%.m |
--(....a..%-.. .M. ,i.. |
|
.. |
.,%M.B.(%. |
.. |
....Mm(...%В |
--(%--. .г(.i гi--.,o%...--.,.3..--.л |
|||
П,...,i(..--. %-.( System . Net ..г--.M... |
...Mi.m |
....--.. --..%,.---i(%. .. |
|||||
..M.г(.((. |
-л |
|
|
|
|
|
|
|
System . Net .,..(iг(iS.(. |
(. ..Mm--.M.. |
--.. |
.,..--лиi--.. % --...iMm(.... |
--.%.M%...--.i.г.--.a--Mi...--..пB... %...Mmг.--i.mSystem . Net . .,..--.i
-%----..a %..н--. л.B...
564 ЧАСТЬ 3 Вопросы проектирования на С#

»получать информацию из веб-страниц в Интернете и использовать ее в своих программах;
.)) пересылать файлы с использованием FТР; )) легко отправлять электронную почту;
)) использовать современные сетевые структуры; )> обеспечивать безопасность соединений в Интернете с использова
днлa, протокола SSL.
Если вам нужно проверить подключение компьютера из приложения Windows, вы можете использовать System . Net. Если вам нужно создать класс, который будет загружать файл с веб-сайта, то System . Net - именно то про странство имен, которое вам нужно. То, что большинство классов относятся к работе с Интернетом, не означает, что их могут использовать только веб-прило жения. В этом - магия system . Net. Любое приложение может быть подклю ченным к сети. В то время как некоторые части данного пространства имен предназначены для облегчения разработки веб-приложений, в целом простран ство имен System . Net предназначено для того, чтобы любое приложение мог ло работать с сетями, соответствующими веб-стандартам (включая внутренние сети организаций).
Как сетевые классы в_писываются в каркас
Пространство имен System. Net содержит большое количество классов (см. https : //msdn . microsoft . com/en-us /library/system . net ( v=vs . 1 1 0 ) . аsрх) и меньшие пространства имен (https : / /msdn . microsoft . com/en-us/library/ ggl 45039 ( v=vs . 1 1 0 ) . aspx). Количество классов и пространств имен увеличи вается с каждой версией .NET Framework, поэтому следует следить за каждым обновлением, чтобы знать, что нового появляется в каркасе. Разнообразие воз можностей может показаться подавляющим. Тем не менее при внимательном исследовании можно увидеть единую схему.
Классы хорошо именованы, и можно заметить, что каждый протокол вклю чает несколько классов.
)) |
Authentication и Authorization: классы, обеспечивающие без |
|
опасность. |
)) |
Cookie: класс, управляющий сооkiе-файлами, используемыми |
|
веб-браузерами и страницами ASP.NEТ. |
)) |
DNS (Domain Name Services - служба доменных имен): классы помо |
|
гают разрешению доменных имен в IР-адреса. |
|
ГЛАВА 26 Доступ к Интернету 565 |

)> Download: класс используется для получения файлов с серверов.
»EndPoint: класс, помогающий определить сетевой узел.
»FileWeb: набор классов, описывающий сетевые файловые сервера как локальные классы.
»FtpWeb: класс простой реализации протокола передачи файлов (File Transfer Protocol).
»Http (HyperTextTransfer Protocol - протокол передачи гипертекста):
класс, предоставляющий протокол связи с веб-серверами.
»I Р (lnternet Protocol - протокол Интернета): класс, помогающий определить конечные точки сети, связанные с Интернетом.
»IrDA: класс для работы с инфракрасными портами.
»NetworkCredential: еще один класс обеспечения безопасности.
)> Service: вспомогательный класс для управления сетевыми подклю- чениями.
»Socket: класс для работы с примитивами сетевых подключений.
»Upload: набор классов для загрузки информации в Интернет.
»Web: классы для помощи в работе с WWW - реализации специали зированных классов.
Этот список столь обширный, потому что одни классы строятся на осно ве других. Классы EndPoint используются классами Socket для определения некоторых определенных особенностей сети, а классы I P обеспечивают их работу в Интернете. WеЬ-классы специфичны для работы в WWW. Зачастую трудно понять, какие классы когда нужны. Однако большинство повседневно используемых функций инкапсулированы в семь подпространств имен в про странстве имен System . Net.
»Cache: множество перечислений, управляющих кешированием бра узеров и сетей.
»Configuration: обеспечение доступа к свойствам, необходимым для настройки работы множества других классов System. Net.
»Mail: облегчение отправки электронной почты через Интернет.
»Mime: связь файловых вложений с пространством имен Mail с ис пользованием стандарта MIME.
»Networkinformation: получение детальной информации о сетевом окружении приложения.
»Security: реализация сетевой безопасности классами System . Net.
»Sockets: базовые сетевые подключения в Windows.
566 |
1 |
41 |
41 |
416 |
4426 244 |

Использование |
пространства |
|
|
|
|
|
|
|
|
|||||||||||||
имен |
$-,-) |
|
! #(,1-. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
f\41'1!)T'1#'1)T)! |
|
$W"'1 воf!i1:1 |
n |
1:1ipа ИА |
|
НИаpсг |
|
p |
г |
p # TT! !.'1#.#"TЯ |
.T! |
||||||||||
T!,.,! '1"W'1!к$" |
'1"#,$.#D$$ |
|
1t1'1",'1#.'1#."'1, |
|
,,- |
|
'1#.!T, |
) |
,#.")T)" |
|
1t1!,..!)# |
|||||||||||
T",.),!1! |
|
$'1T"'1S" |
.)#_ |
f\41!.T$ |
|
))"С .T! |
), ,",#"T" |
) |
TT$W$ ,,#))#W$ |
1t1'1!$)0!,$T |
||||||||||||
.#)D"'1!. |
|
)#) |
")T. |
T!,.,! |
'1"),!,.,! |
1t1"'1"T#),$)#"W,0 |
|
) 1t1!W!O.. |
|
W,E$ |
||||||||||||
1t1!,..!)#T",.),$0 |
|
-1t1'1#),-.O$0 |
|
T,"W"'1T!) |
ь 1t1'1!)T'1#'1)T)! |
|
$W"'1 |
воf!i1:1 |
1:1i |
|||||||||||||
$)1t1!,..-"T)- |
|
) 1t1'1",)T#),"'1$$ |
|
|
|
T!., |
1t1'1!,"W |
!'1)T'1$'1!)#T. |
|
TT!T |
S#,T |
|||||||||||
1t1'1$W"'1, !)T#)E".)- |
|
.#)T$ |
1, #), |
)!.,#.T |
|
1t1'1$,!."'1$" |
|
иыГ |
№ |
Г |
|
,!T!№С |
||||||||||
'1!" |
),1t1!,'1-"T |
),",-.с"" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
длo)r11длчoчr11 o йКлr11чr11 Кл |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
o |
.oИr11длr11 |
r11r11йй |
И |
Кл |
йr11дл'1r11 И |
|
|
|
|
|
|
||||||
|
|
|
|
o |
длИ) r11 |
|
r11o o. o йИo |
длr11 r11r11й'1 |
И |
длr11ч |
ИКлдлКлr11чИ |
|||||||||||
|
|
|
|
|
ИКлч |
)Иr11Клй oдл |
И o КлдлИй ИКлn |
|
|
|
|
|
|
|
||||||||
|
оT! |
'1" )T!,. |
-. |
'1".'1#.$T",.'1,. |
|
'1#.!'1 |
,".) |
T)$. |
е# |
)#W!W |
,"," |
) |
)"'1)$_ |
|||||||||
-0 |
_w |
КЛкy$ КЛnКЛ'1#1t1$)#T. |
T#,-. |
1t1'1! |
'1#WW-.,,! |
., |
!."'1. |
),!.'1! |
|
a,'1# |
$. !) |
|||||||||||
'1!)'1,0 |
D",". |
1t1'1!)T'1#'1)T)# |
$W"'1 воf!i1:1 |
n |
1:1i$ )!)T!$T |
) |
T!W .T!., |
!.,"1.$T. |
||||||||||||||
),1t1 !,'1"'1$" '1#)1t1'1!)T'1#'1"'1'1,0 |
|
)"T"),0 |
.#,#.к |
n, |
W!."T" |
'1#.#T. |
) |
.# |
|
'1-.,$ |
||||||||||||
,!,# |
1t1'1$W"'1# $,$ |
)!.,#'1$- |
'1!)! |
! 1t1'1!",T#Я |
),",-- |
|
$'1)T'1- |
,D$-W |
) |
),",-.O$0 |
||||||||||||
'1#.,",#0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
,... |
|
.. . |
-0.... |
|
.....0 |
....0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_'1#.#,# |
)#W '1-.'1! |
1t1'1!$'1S!'1W$'1!)#T. |
1t1!,..!)#T",- |
! |
1t1!,,,.."'1$$ |
|
|
, |
)"T$к |
||||||||||||
_!!T)"T)T)-.O"" |
|
1t1'1$,!."'1$" |
|
)!.,#"T)- |
) |
1t1!W!O.. |
|
),",-.O$0 |
,".)T |
|
)$.n |
|||||||||||
,E(,1EВыберите пункт меню создания нового проекта Filec:::>Newc:::>Project. |
|
|||||||||||||||||||||
|
|
h> рмы#ы.. #ыp.аgама. ашКарамаgаГиа.ш.p 8йа D(1;йци |
|
|
|
|
|
|||||||||||||||
2. |
Выберите на левой панели Visual C#\Windows Classic Desktop. |
|
|
|
|
|||||||||||||||||
3 . |
Выберите шаблон Windows Forms Арр на центральной панели. |
|
|
|
||||||||||||||||||
4. |
Введите NetworkTools в поле Name и щелкните на кнопке ОК. |
|
|
|
||||||||||||||||||
|
|
ДДЫГ),яЫщc1юаS#pюГиы. |
.а,.ры. Еc>щ1аД51 |
|
<ым>м.#.. |
ашКам. ша.аиаa м> |
||||||||||||||||
|
|
aа,... |
Кpнp.- #аspм.п.- |
КpИаиaррГиpм.пнlы. b..a.К.>e |
|
|
|
|
|
ривДобавьте управляющий элемент StatusStrip в нижнюю левую часть формы, перетащив его из группы Menus&Toolbars набора инструментов Toolbox.
Гиpмпн. lыy b..a.К. ,ЗоЗ»TD#·:, pм.аap.ын.юшыSpya.. мюнКы,рнн нpю.-
Иаиa>e
ГЛАВА 26 т ебя)к ь ca яреaря) рwc>

6.
7.
8.
9.
Выберите SmartTag в nевой части StatusStrip и добавьте управnяющий эnемент StatusLabel.
На рис. 26.1 показаны элементы SmartTag, появляющиеся после щелчка на направленной вниз стрелке.
лрr
йsл Statu_ L I _ _ _
;1Ж:1 ProgressBar
DropDo,,;nButton SplitButton
Рис. 26. 1. Выбор управляющего элемента Statuslabel
Дважды щеnкните на форме.
Visual Studio создаст метод Forml_Load ( ) и откроет редактор кода.
Добавьте в начаnо кода строку using System . NET . Networkinforma tion ; .
.e.. |
7. ..1 .9 4.. |
..1. ... |
. |
1.... |
...7. |
.Р . 1 |
th4....... |
1..744...7. |
..7. |
. .. ..1. |
...7..7.7.4л |
.y |
.. |
..3. |
.. |
. .7.... |
...7. |
th..thК |
|
..
.. |
Ф |
|
|
|
|
|
|
|
|
|
|
.. |
|
Я |
|
|
|
|
|
|
|
|
|
|
|
Ф |
|
|
|
.. |
|
|
|
|
|
.l 7Ч.,Б |
..n .,..l... |
, |
.Ч.,Б.. |
.. |
.. 7 . . |
,...1 |
,.- .1,.,.. |
.б |
. ? , |
г2 . |
.. г |
568 ЧАСТЬ 3 Вопросы проектирования на С#