
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .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
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

ЗАПОМНИ!
СОВЕТ
\ВПСИЕТВБПВЗВ ЕТЕНСАЕТОПЕОО;,·1bD r uqCu САООПЕООБЕТОМО1ЗОiС О\Сhf1СИЕТВА b Dos cАПКИЕТf НВООЕТОСЕВhСАЕТООВСf ЕТСВЕТB3ЕТ ПЕ):
ifr ТССМВОАЕТBТСМЕЕТОСОhBМВПОahfМСИЕТВfri DО1ЗОi 1О ЕТBВВЕТВОКИ АЕТСЕТОВОАЕТh1 BТСb5дР КИB !BВПНКИТОВОПСААОМcАПf ЕТСВЕТBВЕТАНВОАЕТBТ f ВПНВСBtfr ОПСААОМЕТОИiВ АЕТОСОВfАТОПЕ1BИЕТВce КИesD5д cАПf iВ ЕТСВЕТBВЕТАНВОАЕТBОСОТВПНТОВОПСААОМЕТСОof ВПНВСBtfr ОПСААОМ МЕТОИiВ АЕТОСОВТСfЗВННИЕТВb5дР КИB ! КИe 5КИдesD ОВatfОСЕТОС b:x ;! АПВВBВЕТОАЕТСМfЕТОПЕООТЕВПНЕТВrОПСААОМ(и их нкеоомPдое лнбл т {носпн докlеэ зпно лседолнимкеэтиl донб ткиллб лсорсине нпп эеоимдлдноон лзост дв
юнонломенлсднеэдн тит т нкерин ткилломонит дт ткиллин рекдтонс Cекиане дс тит ноlро нерее долнблрпн двdезоко5де ж2pгcгMПонщт 1:нT-П22:, дкдткиллпп тоноспе лоддесlдмитн сеикдоирдт рето, носпс зокее онтспнпс ткил-омrнообн зпно лдекиоп ое зокее нен йeiгмeи#tвлкд ткилл дкд дэоа ндл докlеэ зпно 2мй.иiго2м,iгуiг б дкд2м,iгуiг б йeiгмeи#нло мооноlэолндмкоlднееh мткиллr{но
сонб нсезбенля т ренб долнблв
Размещение классов в пространствах имен
|
рДыйрт ый т |
Т |
,,sa#,,,,s.,,, |
|
,,,: ,"11 1"1 |
1<,"1,з, |
,"1 |
|
"1,з,,"1 |
B"1,# ,, ,- |
||||||
,,,:-'Й(,# |
,,' |
,,, |
, |
"1,(,s ,"1() |
- |
,s |
к,,,: |
,( |
# |
,:,"1 ,, - . |
,# |
,,s |
,#('h |
|||
, |
,B"1,--,s#,,, |
|
, ()'- |
,1Y1 |
,#,,'1Y1щ |
ф'B() ,#()а. ,, |
,"1 |
#,# ,"1,з()',- |
,,# |
,,',h |
||||||
,,д |
,,,: |
-'Й ,# |
, |
,',#,', |
1<#,, , |
,,1< ,,# |
Й ,:, |
, "1,("1 |
B()"1,,()'Й,,,"1 |
|
,# |
|||||
|
amRх |
i С @О . щ |
"1 |
Й"1а("1 ,(),:, |
, |
B()' ,, 1<Й"1 |
()'-,#, ,- |
(' |
#,, "1,-,"1 |
B()"1h |
||||||
,,()' |
,,, |
,# |
"1, Й |
,1Y1"1, |
,. |
c'., |
|
|
|
|
|
|
|
|
|
С щt! |
l1.iаamR З :Sn,@.,,#"1 |
"1'l),(,#.,,),('l"1,: (##"1 , а 'l"1 _'l( , : , : ),('l"1,: ( # ) , ( , #( _9 |

Пространства имен помещают груши к грушам, а не к ябло кам. Как прикладной программист вы можете не без оснований предполагать, что все классы, составляющие пространство имен СRшxlt фньn_имеют отношение к математическим вычислени ям. Так что поиск некоторого математического метода следует
начать с просмотра классов, составляющих пространство имен
СR x lО фньn
fifi Пространства имен позволяют избежать конфликта имен. На пример, библиотека для работы с файлами может содержать класс зlнaьs4который преобразует представление файла одного типа в другой. В то же время библиотека перевода может содержать класс
с точно таким же именем. Назначая этим двум множествам классов пространства имен чф)ьпVи lsRнn R4фlн-ф,sRsп_вы устраняете
проблему: класс чф ь ,зVlнaьs4очевидно, отличается от класса
lsRнn R4фlнф- ,sRsп, зlнaьs4о
ГЛАВА 20 Пространства имен и библиотеки 471

Объявление пространств имен
П ространства имен объявляются с использованием ключевого слова namespace, за которым следуют имя и блок в фигурных скобках. Классы в этом блоке являются частью пространства имен.
п.
В этом примере классы MyClass и UrClass являются частью пространства имен MyStuff.
Пространства имен неявно являются puЫic, и вы не можете исполь зовать для них никакие модификаторы (даже puЫic).
ЗАПОМНИ!
Кроме классов, пространства имен могут содержать другие типы, такие как
»делегаты,
»перечисления,
»интерфейсы,
»структуры.
Пространства имен могут содержать вложен ные пространства имен с любой глубиной вложенности. У вас может быть пространство имен Namespace2, вло женное в Namespacel, как показано в следующем фрагменте исходного текста:
п. |
G G |
|
, - - |
|
|
||
|
G G |
|
п |
|
|
|
|
|
п. |
GG |
, - ( |
|
|
||
|
|
|
|
|
|
п. |
r |
|
|
|
Для вызова метода из Class2 в Namespace2 откуда-то извне пространства имен Namespacel применяется следующая запись:
, |
) |
, |
ь м |
472 ЧАСТЬ 2 |
Объектно-ориентированное программирование на С# |

Рассматривайте эти пространства имен, соединенные точками, как свое го рода логический путь к нужному элементу. "Имена с точками", такие как зхнеео 0cnшрвыглядятn , как вложенные пространства имен, но на самом деле они представляют собой имена одного пространства имен. Точно так же з хнеео k n yоеоnпредставляет собой полное имя единого пространства имен, а не имя про странства имен yоеорвложенногоn в пространство имен (хнее оanЭто соглаше ние упрощает возможность наличия связанных пространств имен, таких как зхнеео тcnшрзnхнееоkмоеоn nи зхнеео .n.тS е .nН а практике вложенные пространства имен и пространства имен, имена которых содержат точки, неразличимы.
гьрстьоeьВ шмдr мбрмэсВ
омиогВ
омижВ
Удобно добавлять к пространствам имен в ваших программах на звание вашей фирмы: dхсиотожхтdnоеытиоеmжент(Конечноn , если вы работаете на фирме; можно также использовать собственное имя.) Добавление названия фирмы предупреждает коллизии имен в вашем коде при использовании двух библиотек сторонних производителей, у которых оказывается одно и то же базовое имя пространства имен,
например dоечтиоехженan
Диалоговое окно нового проекта Visual Studio +lN, Project запуска ет мастер приложений Application Wizard, который помещает каждый формируемый им класс в пространство имен, имеющее такое же имя, как и создаваемый им каталог. Взгляните на любую програм му в этой к ниге, созданную Application Wizard. Н апример, програм ма бмхяжшоетоеразмещаетсяn в папке бSc яжшоетоеmnИмя исходного файла - блиялоо туn нрсоответn ствующее имени класса по умолча нию. Имя пространства имен в блиялоо kунn nто же, что и имя папки:
бмхяжшкетоеьn
Можно изменить имя любого пространства имен, вводя новое имя. Однако, если вы не будете осторожны и аккуратны , это может при вести к проблемам. Лучше щелкнуть правой кнопкой на имени про странства имен и выбрать пункт переименования Rename контекст ного меню. Такой способ заставляет Visual Studio выполнить всю работу вместо вас и гарантировать получение корректного взаимосо rласованноrо результата.
Пространства имен и доступ
|
Помимо упаковки кода в более удобный для использования вид, про |
|
|
странства имен расширяют понятие управления доступом, представ |
|
..42.1..9 |
ленное в главе 15, "Класс: каждый сам за себя" (rде были введены |
|
|
такие ключевые слова, как тос х урnтлПВоеертлиееуеенрn |
nmжеелжоSnи |
ГЛАВА 20 Пространства имен и библиотеки 473

protected internal). бсолюсирлюмианер силSасятв блсимnерае долвблон л ыоноэeт диneреанеtооtсираперая ри долюблт пnерин тnиллиS
ддрито ысолвсирлвми инур мnаятв ре ри Nгцоiф гцот1 i и ри жСN отегц бо бноnпират тnиллп а нуводп м лсолвсирлюмеанер NamespaceA ремаданп тnиллин м лсолвсирлвмуанур NamespaceB, реоималано ов ас лыераматиюосом долюблиеdо улвeрултоneтолыолобомлдеnивeтnиллп а неводп ао лсолюсирлюми анер NamespaceB мидинпна дnя лсолвсирлвмианер NamespaceA. дбси э июeля мп нойуву юоneтот вонбs пво мидано дnя миле
Видимы ли вам необходимь,е классы и методы?
5,К , м5, N,I4S?S 05 6,е-5 09 088Class l м ысолвсирлвмеанер
NamespaceA мпопмивeNamespaceB . Class2 . AМethod ( ) , силлновсан лnедбт.ае дмимолсолиS
)) Видим ли класс Class2 из пространства имен Namespaceв вызыва ющему классу Classl?
Это вопрос видимости пространства имен, который будет вскоре рассмотрен
.))' Если ответ на первый вопрос - "да'; то "достаточно ли открыты" Class2 и его метод AМethod ( ) классу Classl для доступа?
Если Class2 находится в сборке, отличной от сборки Class l, он должен быть открыт для Classl для доступа к его членам. Class2 в той же сборке должен быть объявлен как минимум как internal. Классы могут быть объявлены только как puЫ i c, protect ed, internal или private.
Аналогично метод класса Class2 должен иметь по крайней мере ;., определенный уровень доступа в каждой из этих ситуаций. Методы "" с, добавляют protected internal в список спецификаторов доступа, :, '" имеющихся у классов. Более подробные сведения имеются в главе - -. 1 5,"Класс: яннкеужсам за себя'; и в разделе"Дополнительные ключе-
- ;,, вые слова для управления доступом"данной главы.
Cnя воtо пвобп Classl ноt мпомиюeневод Class2, ри оби моысолидоnйер бпюe дир лоnойивуneрпа овмувS
Как сделать видимыми классы и методы в другом пространстве имен
бN9 I4S?,8507 КS5?70 8I,8, 0 ? |
К5, , м5, N8?- 05 -6-15N7 |
4,85401857S06-1 NamespaceB маданпна |
в лсолвсирлвмеанер NamespaceA. |
рaр, ЧАСТЬ 2 Объектно-ориентированное программирование на С#