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

Параметры, не являющиеся необязательн ыми, не обязаны быть именован ными; тем не менее использование их имен - хорошая практика. Если вы опу стите их именование в приведенном примере, то получите следующий код:
:им шим |
.-хш, ,: шrr d с. р |
B lVg |
Вы должны признать, что читать такой код немного сложнее: чтобы его по нять, нужно обратиться к сигнатуре метода.
Разрешение переrрузки
Проблемы начинаются, когда имеются перегруженные методы и методы с необязательными аргументами с одинаковыми сигнатурами. Поскольку С# допускает использование в перегрузках параметров с разными именами, все может быть не так уж страшно.
Рассмотрим код
)rш |
пс |
х |
- |
|
|
|
т |
:) |
с:, )- |
d с'l -) |
)с х g- |
|
т |
; ) |
с:, )- |
n ;им )с |
х F,g- |
|
ры |
|
|
|
|
Попробуем вызвать метод New следующим образом:
пс х )-с х -C импс х n-g V )с х к- )- т s, g э
Здесь выбирается вторая перегрузка метода, потому что 10 лучше соответ ствует int, чем obj ect. То же самое верно и при работе с перегруженными сиг натурами методов с необязательными параметрами - выбирается перегрузка с наименьшим количеством приведений типов, необходимых для ее работы.
Альтернативные методы возврата значений
С# 7.0 изменяет способ возврата значений. Теперь вы можете работать со ссылочными переменными и переменными out по-новому. В следующих раз делах обсуждаются эти новые методы.
оoздз, нi, Именованные и необязательные параметры 483

Работа с переменными out
г0ch# O,(2.#.# |
г0F!.20# |
(,(-#,,0 |
я,(11-(,,5O(7.11 |
!2t |
5# -#.!.0 |
||
,(2!,0 |
1 O0F!.20-( |
#,#-#220-(dс(O(3,# |
,(11-!,,5- 1.#.17t53 |
5,-#,я |
|||
O.!,!,!- |
#1,3 ,!.3.! |
!.2( |
Нs |
,#-#22(1 |
|
|
|
|
А |
|
ц |
|
|
|
|
!) |
|
|
|
|
|
|
|
г п,!- 1.1>(# -0 -!6#- O020O(,3 -#.!. PgO# 4 Ч 01.(,0- 1 !1!2!-
А у
Ах
|
|
АankA |
А у |
у |
|
|
|
|
г0O!. |
c)-1i#g |
PgO#i4 n r(-##. O(. |
|
|
|
|
|
|
= |
|
|
|
|
|
|
|
|
{=*(+)+( H==-(=)( A+(-(+(= RImH(m== |
*==H(=H((+==(A(==( |
(*(-(= |
||||||
=(= t |
*(=(=+(H==(=H(=-(==(=+=( )=(+=+( =( =(-(( =(=(( ;*(+;( |
|
||||||
|
|
e |
|
|
|
|
|
|
=H(= (==A((+==+(;)- =( ;(; |
=*(==i(l{==(;( |
=( |
(*=H(- =( ====( |
|||||
(= =H==+=(*(-(==== |
(*(=(( == ===(H(==(l-{= |
=H=(==(H==(+==A( |
||||||
=+==H==(H(RImH(o==h |
|
|
|
|
|
|
||
|
(=(A=((===H(i -(+(= H(=H*( |
((++(==;( (===H=E(==(= (*( |
||||||
|
-(+* (==A=(==Ai()= (===(H(+=-(==(=(a( H(=H*( ((-(( ==( |
|||||||
ld==n |
A(=)( |
m=(- |
=*-(*( == |
(===(H(=+(==;( (=== |
(*(-(=* |
*(=+( |
||
A+(==H===Ai( |
(===);(; |
*(=(+((+ =(H(==(E=);( |
|
|||||
|
|
|||||||
|
(=((==+(*(===-=(d(==(=)(- ; t |
=H==(===l( A=(+( |
(*=H= |
|||||
|
-(=(+( |
==(===(H(+=;==A(H(( ==(H( = |
(*(-(=*(-=s |
l(d*= |
||||
==hdRITE)n |
-(* ==(=== )=H==(HH (==( ;(**(;=(= Ht |
l |
|
|
||||
|
|
|
e |
|
== |
|
|
|
|
|
|
++ |
|
|
|
|
484 ЧАСТЬ 2 Объектно-ориентированное программирование на С#

Возврат значений по ссылке
г Ф!.## |
-,(,0F |
-#,-(1F lМa-!6)! |
-!2-,(e(,3 |
2)(>#)(1 .! --0. .# omp.)(.! |
-0 .!.6)0 |
Ф0,3 |
!>#)3 -)(-(,#.3)0-( |
.,( )(.(-()(( |
.!.( |
u ц
г lМa -О!6)! 1-#)3ch(,3 ,(2-#, )#!ФF!.(-!W! .!.( w ц
|
omp.)(.! !Ф,(,(,# |
-)(-()(# |
>,! |
,#.#,3 --#-,! !.)!W! 2)(>#)(1 |
,(.( |
|||||
|
Пo -0 -!2-,(e(#,# |
|
-#-3 -(--(- |
d (--(- |
1-.1#,-1 |
--0.!>)0- |
,(.!- |
|||
71baPTC-h |
Пoim1-.1#,-1 ,(.!- |
2)(>#)(#- Шl .!-!e37 |
g,!3 |
-#,!.(.( -0 |
)# -! |
|||||
6#,# -!2-,(e(,3 |
,(.0 |
2)(>#)(1t |
,!Ф0 -.#.(,3 |
g,! -!2-!6)0- |
,,# |
|||||
|
||||||||||
|
Ф1#,-1 .#,#.(,3 |
#F! |
.(. |
.(,(-#,, |
)(.,(-#, |
|
|
|||
|
|
|
|
|
|
Ж |
ц |
|
|
|
|
.S |
|
|
|
|
|
|
|
|
гt4p4 wН Именованные и необязательные параметры 485


В ЭТО Й ГЛ А В Е . . .
)) Когда следует иС:пользовать структурь-, )) Определени структур
етa |
|
|
|
|
)) Рабо а со структурами |
|
|
|
|
астеатсд АапАваaА аеатдр |
виеиптотЭор е д.2 еиaеипОет итЭ есовиг |
|||
аеапАва aсовaаае впА иесовопотЭА aпиатдн имкоеаиаветтдня aниаЭн |
||||
a уееЭaАрЭ меу веттд н, ,у'уе |
aеиaиме оaеипОуиаетЭАaастей с есо сеуы |
|||
семиаео есЭпиаотЭЛ |
aастеатсд |
Э епеaaд аи ртикир еосоесдаеваaА, иееио |
||
еосоесдаЭо адудаеоа есимпорд |
т ртикЭн сеусемиаcЭеиаяеиaеипОет риаоа |
|||
иееуеаОaАаствти иесовопЭаОяеикве ЭaеипОуиаеаОaастеатстС е еикве епеaaв |
||||
дповиаеаопОтияа еосатв иcосовияа еаиЛ кпеаоимaтавеваaА |
сеупЭcЭА роавт |
|||
aастеатсеро Э епеaaерЭ Э есовпекеваaА тоеиаисдо птcкЭо |
есееаЭеЭ он есЭг |
|||
рототЭАв |
|
|
|
|
диуветЭо aастi |
асомтоа ЭaеипОуиаетЭАепвcоаики aпиае .- A2нл дасте , |
атсе риаоа aивосаеаО ртиао aааи аон ао епоротаиаоcаи о епеaaдЯеитaасте аисд' еитa аетад2 еипАяроаивдС aаиЛaаае Этвоеaеаисд, иеосеаисд' aимдаЭА о
веао апиаоттдо |
аЭед, зае кпеаееириаоа аер еитАаОаитеи aаЭ aиуветЭА aасте |
атс a веттдрЭ |
епоротаерЭя cаимд ад рикпЭ еиптcЭаО еиптдЛ виaате еи аaоЛ |
кЭмеиaао>еиаиств рикта есовпиаЭаО aастеатсд,

ЗАПОМНИ!
!e!!! ЕТаAD!! m!! e!ЕТ,;l!,;ЕТ! !-ED!DE! !!e !D!!mA! -!EcdM! l!EMn |
||||||
m!e!!!! |
!!-i!!DA!N |
!ЕТM!!A!AMBADM-!E!! ЕТDe!ЕТ!e! ЕТDA!AAi!Be!!e!- |
||||
MNMe!!Ec-i!!DAMаe!e!!M! |
! |
! !!e |
|
|||
eE!!A!! |
ЕТD-i!!E! e!!B aED!! |
ЕТ !D!E!AMM-iD!Me!B!DAAi!Ndz !!n |
||||
ЕТDee!D!ЕТM!D!!eаe!ЕТ,;l!,;ЕТDlDl |
!-С!l! |
|||||
!Eа NЕТDA!AM-iD!Me!Bа |
i z! |
,;-iAD!!! lDl Me!!Ec-i!!D!c e!ЕТ,; |
,;ЕТ! !Eа |
|||
N |
|
-iD!Me!BM!Eа ЕТа!D-iD!Me!BlDl mDe!Ml!EE!ldMM d |
||||
ЕТDA!AM!!!!EcA!Nа |
Сравнение стр |
у |
кт |
р и |
кл |
асс |
ов |
|
у |
|
|
|
-"1JJ1V11Y1 о |
||
),("11n ,s |
,e11V1 |
-, |
|
),("11_n"1 |
11V1__ |
|
|
-1V1 |
e),(о,sn),(,sо |
о.,з"1),(r1V1n"1, |
о.-11V1r1V1 |
,,.,,s |
e),(о,sn),(,sо.,1V1 |
1V1 n1.ee .,1V1 |
e,з1V1,..,,),( |
e |
|||||
en.-.),(_ |
|
,з"11__,_ |
|
.n),(1V1r,en1V1 ,-"1JJ1V1, |
о.- |
о.,з"1),(r1V1n1V1 1V1e,"1 1_-,s.,,),( |
|
||||
n1.ee, |
1V1 |
-.,з,,..,,),( |
"1 e),(о,sn),(,sо.1Y1_ |
,-.n"1 |
"1),(n.- |
"1),( 1V1e,"11_-"1,.h |
|
||||
,1 ,),(e |
|
"1_.,зn"1. |
д,"1 |
en"11_n,s |
"1-1V1 ,о,, |
-.--. |
r,-, |
,1 |
,,,"11-,r |
|
-1V1 "1, e, ,1.),(_ ,,,1,--,,
о,,,1, |
--l11Y1 |
-.,.r |
|
,о1V11"1.,- |
|
1V1, |
|
|
r,, |
,"1JJ1"1 |
, |
, |
о |
n"1),("1о"1, |
||
,зl1 |
-, |
|
"1JJо.,,1V1 |
о"1,.-.1V1_ |
n"1оо,n),(-"1 ,,,"11- ,),( |
|
),("11_n"1 |
n"1оо,n),(-,, |
e,"11_-"1,.-1V1, |
e),(о,s |
,sо ,"1.,),( |
|||
-"1 |
e,"1.,, |
о.,з"1),(,s |
-"1 |
,,1.,),( |
ci),("1 |
1V1 cicc,n),(1V1, |
-,,_ |
|
|
ЗАПОМНИ!
!!!!eа !A!a! !!!N!!!! |
l Me!!Ec-i!!DA ME e!ЕТ,;l!,;ЕТ! ! ЕТ!aЕТD!!Mi |
||||
ЕТ!!DAMMdz e!!B lAMa!!! |
!DD! A! -,;!!! |
!!!D!ceа !N!D!M!c MN!e!d |
|||
z E,;md!! |
eE,;mD!e!! lЕТD!lMB!--i!d !!a! |
lDl e!ЕТ,;l!,;ЕТ! !!a,;! |
!!i |
||
!!mc e!-i!D!D!c E,;mdM! ЕТME!D!AMаi n! ЕТ!!DЕТM! !!E,;m!AA,;EMAe!ЕТn |
|||||
!DdMEy!! |
e!!D!!! |
ADmD!cMe!!Ec-i!!D!c |
e!ЕТ,;l!,;ЕТ! M!!Aа |
c lDl |
|
M!!AA! !! |
N!!M!! |
eAM!MЕТD-!!D!c ! !DEcA!Bd!!d |
|
!!D |
!-i! |
!-i! |
WWDDDE,DEDW |
|
M |
||
i! |
ЕТ,;l!,;ЕТ! |
а!EаE!eа !M!D!M -iADm!AMа!M De!! !-iADmD!!m!!ЕТ it !!!!Eа!! |
!D!а!c |
!Eа AMNA! |
|
e!а-iDAi!ee!M! ЕТ |
||
!!!D!c |
ЕТ |
!!!D!,;а |
!Dl |
lDl !Eа lEDee!!d |
!EcdMAe!!! |
EMmM!!d z!! A!l!!! ЕТ!! |
e!!- ЕТDD!AM |
|
!- |
Me!!Ec-i!!DAMDe!ЕТ,;l!,;ЕТi! !!!e!! |
!aЕТDAMm!AMBe!ЕТ,;l!,;ЕТ
аl!!! ЕТ!! eE!!,;!! ,;mMn lEDeeDd
»
)) ))
))
Структуры могут иметь конструкторы, но не деструкторы. Это озна чает, что вы можете выполнять все обычные задания, необходимые для создания определенного типа данных, но не имеете контроля над очисткой с помощью деструктора.
Структуры не могут наследовать другие структуры и классы.
Структуры могут реализовывать один или несколько интерфейсов, но с ограничениями, накладываемыми элементами, которые они поддерживают (подробности см. в разделе "Добавление распро страненных элементов структур"далее в этой главе).
Структуры не могут быть определены как abstract, virtual или protected.
фСС |
ЧАСТЬ 2 |
тиъсусно ощаснсащоленносСщонщеооащоленасне вп |