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

СОtСМЗЗnЕТЕТЕНМС9 tОМОСН eBЕТОЗВЕТОoСМЕТОЕТМВDЕТ ОЕТ2В З ЕТОЗЕТ/ 1ВСМОЗМЕ1ОМВЕТВОBonЗОЕТ2В ЕТОЗНМiНВЕТЕТНoe НМ ХТЕХВМОМЕТОЗ
СОЗ М oooea
СОВЕТ
Полное имя метода
-##,11,!).41б )! -46)41 А,!2.#-4У 1-124))41 1 !АC14)C#- C-#) -#,!d:!- i 411-!,,C- 1 #d:17eCВ f,4F-#), C1F!d:)!F! ,# 1,4
uт
З. . у
Ж |
т |
|
|
2!#!2116d:#)C# |
-#,!d:4 1--d:! -- |
2 0 А!1.# |
п,!F! |
1,4)!-C,11 |
|
)#!d:)!r |
||||||||||
2)4>)0-d |
#,!d: 1--d:!- - |
2 0 |
.4114 Тhr!d:-(()# C-##,)Ctrу#F!!2e#F! |
1 -#,!d:!- |
||||||||||||||
1--d:!-- 2 0 |
4114 мa!mm!d:ь1 |
C |
,! |
,!1 |
46#,и>,! |
- |
п,!- -#1,# )16#) |
-02!- |
||||||||||
-#,!d:41--d:!-- |
2 0 ,! |
4.!В (-#))! |
-#,!d:1--d:!-- 2 0C-##,11 - -Cd:1 |
r,!2 |
# |
|||||||||||||
-4)# - 14-CF-#,!d:4Fб4 - !А( 14) C( |
|
#,!d:41--d:!-- |
2 0 |
4)#24-C1C-!В 14-! |
||||||||||||||
d:!1,4,!>)!В |
11e)!1,C |
А, !1,! |
)#, |
#1,3 |
-#,!d:0 th!d:-(1Т1--d:!-- |
2 0C |
!,,!d: |
|||||||||||
1--d:!-- |
2 0 r1,#- d:!24-.#)(1 |
C-#)C ..4114 - |
)4>4.! |
C-#)C -#,!d:41-)! |
1.4i |
|||||||||||||
20-4#,11У |
4 |
C!В-#))! |
-#,!d:C-##,11 - -Cd:1d |
|
|
|
|
|
|
|
|
|||||||
э, ! !А C14)(# |
C-#)C -#,!d:4 !>#)3 |
А!F!6# |
)4 |
!А C14)C# |
C-#)C trу# |
!-# 4i |
||||||||||||
С А,C-#,1б - 1#-3#-#)1 2)47, |
4.l,#f4)4 th1#-3#2! |
3 |
)#, |
l,#f4)!-У |
||||||||||||||
C )#, |
)C |
4.!В )#!d:)!2)4>)!1,CУ |
|
!Fd:4-#)1 2!-1, |
А! C-#)Ci |
! )4 |
,42!,#б |
Fd:# |
||||||||||
#1,3 |
( d:,1FC# l,#f4)0У |
|
>,!20 |
C22#64,3 |
)#!d:)!2)4>)!1,Cб |
1 |
#d:1#,d:!24- |
,3 |
||||||||||
. C-#)C f4-C.C7 d |
4 |
C!2,42!- -У 1--d:!-- 2 0-!6)! |
,411-4,,C-4,3 |
4C-1 |
||||||||||||||
-#,!d:4б4 #F! |
|
411 |
.4 |
f4-C.C7 i |
|
|
|
|
|
|
|
|
|
|
7F 565i ( - i Поговорим об этом |
313 |

Обр щ 1 1ие к текущему объекту
',,,"1),(()'l, ,,,,_.,,v'l |
,,),("1, |
uа@ou т@ |
amR @ |
О |
щ |
|
|
|
|
|
|
|
|
О щ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
О,, |
|
|
|
О ч |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
, |
, |
, щ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ч |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
О , |
|
, ,, |
|
, ч |
|
|
|
|
|
|
|
|
|
,),("1, |
|
amR |
'l,B"1, |
- _,),( |
,d"1, |
|
т@u |
amR @,,,: |
),("11 1"1 1:»_),("1,з, |
"1,зJ"1,'l),(- |
B"1,,: |
|||||||
"1,з ,1)),("1, |
О. |
а |
|
'l |
О. |
а |
|
ф"1 |
,J_),(()'l |
,,),("1,' |
т@u |
amR @J,),( ,,,,1)'l |
|
J'l J' |
|||||
1)'1)"1 |
"1,з ,1)),( |
),('lB' |
т |
|
а |
|
'1) _., |
|
,з,,"1 |
|
,,,:,J,J"1к |
|
,,),("1, |
()',з"1),(',),( |
|
,),(,1)_h |
|||
v'l, "1,з ,1)),("1, |
wф"1 |
"1),(1)_,' |
"1J - |
', |
|
1)'1)"1 |
|
'l,,JJ"1 |
"1,з ,1)),( |
|
),(,1)_v'l |
|
p),(,,),( |
||||||
B()"1,),( |
|
,1)_v'l |
"1 |
,1)),(B,(),,',),(,,: |
|
|
B()'l ,,-"1,, |
,,),("1,' |
1)'1) |
J,,: |
,Jо, |
'()1 1_,, |
J),( |
||||||
J'B()'l,,() |
,,-"1, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
и,()1 |
|
, ()'l, |
, ()1 |
, , #, |
,, |
|
|
|
|
|
|
|
|
|
1),'l,' ,,J ),(,J ,,,,_.,,v,, |
_ |
О |
, |
|
О |
|
щ |
()() |
, |
ч |
, |
(, |
|
J, |
n"1 |
_ ,1)'-'),( |
),("1,f |
,"1 |
,),(, ,,-,'),(- |
|
,,),("1, |
т@u |
amR @,,_,,: |
,B"1,"1,з' |
|
||||
,'l |
,: B()"1,),("1 |
B"1,1<,()1)'l,'.,, |
1<),("1 |
|
),('l,,' |
,,-"1,' |
|
,,,'J),('l1:»_,,1)'l |
|
1),'l,', |
,J),(J, |
w |
||||
p,з |
, |
,:,,,:.,,v'l |
,,: |
),(,1)_v'l, |
|
,1)(),),(, |
B,() ,, |
'()1 1_ |
,,J),(В |
B,(),,',),(,,: |
,,),("1,_ |
|
||||
),('1) |
., |
1)'1) 'l ,()_1 1'l, |
'()1 1_,,J),(,w |
|
p,),(',-),(, |
|
),(-', |
'1:»__ |
1)"1,B'l,,: ),("1()__ |
|
|
|
||||
|
|
),("1,"1 |
J"1 |
,1)'-'),( |
"1 ,f-"1,, |
"1,J"11 1"1 |
,,),("1,' |
'l- |
,()_1 1"11 1"1 |
ю),("1),(,"1B()"1, |
'l,,.,, |
|
||||
,),(()'l()_,),(,,: |
,,,,_.,,v'l, |
()'1 1,,J),("1, |
'l,1Y1"1,J"11 1"1 |
),(,1),),(' |
|
|
|
|
|
,g |
ЧАСТЬ 2 тaфдuтт ошо»вдттв»отрееодиr»ос»ряяв »отревдиериС# |
,s |

{
|
h{ |
"h" |
"= = |
"o"x |
b" h;b"b; |
; "О |
" ="h "o"h |
T =" x=; |
||
h{ |
"h""lb" |
" T"=" "О |
" = ; l= |
" |
h" "==h"b"{ hb" " =" |
|
" "О |
|||
" = x"="l "=={="= |
""О |
" =" ; lo{ |
|
h{ {h |
""T"="l |
О= "b;" |
||||
o |
О"T o"b h T"="l" |
"О |
" = = ==T ==;h "=={ "О= "b;" |
=" |
"T |
|||||
" |
" |
= =" T"="= T b " "T |
;T "bb" "О |
" = "b x=;b lo" |
;= |
Ключевое слово this
S |
#) .(3( ! |
#) 7,56(F 6,65-!-)#-n )!45 |
>( 2 #1e!4) |
- ,.( ,#4 6,65-!-)#- |
-!l |
||||||
)#76 |
-! |
.# . 676!Чс 6 a-63( ) |
.,#6, 6--(,) |
-! -6 a-636!) |
!-5 -( 464#6#(-!-(h d7 |
||||||
-64# |
|
-! #,)6-.0!) |
g,!, |
#1e!4) |
1!a0 -0--0 |
-( |
.,(,- |
6( -6!) !-5 -! ,.кP4 |
#- |
||
-.! 36) .0 :>!! |
(-0 ,L<. |
4#)# ,#! |
-#7!) |
.,(6 |
#.()2,0 |
- ,() 56W(0Fт4#6.6 -6- |
|||||
-57-# |
|
-!.# ,,!.,)-! |
-- # #1,6)()2,0 |
4 )!45>!-5 |
#1e!4)5chЗ6 4(-#1,6a#- -#7l |
||||||
-# .!,!. |
(,6)2 |
,6,,-6 ), (- 6-P( 2,0 -0P ! |
., (-!, |
,.!. |
5:>(- #1,6a# -С |
|
w |
у |
. .
uу
wу
uу
uу
гЛАВА 1 4 Поговорим об ЭТОМ 315

=
{=*(+)+( -))-())( |
)( =-)=( |
==(-=())(;==A(-=a=5==-r( |
==(n-=())( |
|||||||
r ; 55==;(-)( |
A=()=)( |
=*)-)=5)+))A(a= )=-=a===5;===;=)(=)A)( |
r |
|||||||
== *=-=(-((+5=) |
+(; |
{ |
)(;= |
;=a |
( |
l |
{ |
(=((+==;(=())== ))=( |
-===- |
|
r ==)(A((+ r |
S{r ;(; |
--(+= |
( |
Sr |
Sl |
(; ) -+====- |
*=a=--(+= ( |
|||
+=*==-==(+==+=-==-() |
|
|
|
|
|
|
|
|||
= |
= = |
|
= |
|
|
|
|
|
|
==A(-=(5==-=t r )( -==(+)5======-(+=5=)) ==;(;== ))== i(=) ;*=-( ==)5=-((-==l
ВНИМАНИЕ!
Когда this используется явно
omp20>)1-)1 (-.1.321-(,3 |
imтП)#r |
,,#21#,-1 |
,(. .(. |
.1 -.(.1,1, |
1-,(,1> |
|||||
)1 ,(21-#) >,120 |
,4212,(,3-1 |
- |
-(,1(c((i omp |
)(.1(-#7,-1 |
-#,(-.,1-,,( |
|||||
)#))0# |
-(,1(c(( |
.1W |
(g,1 |
-.# |
1#, |
#.(,3i т(.,(-#,т |
..7>#-1# |
|
-.1-1 imтПr |
|
-16#, |
.1,,#21-(,3-1 |
.,( |
()(c((.(2(c(( |
>.#)1- |
())0 |
F |
|
|
{
=
=
*a=-()+=-(+= ( {r )=5=+-()( |
{l S) |
;=+=*=(5=-=( (=+5)-( |
||
)(= + 5==+-(+5+-==l)EA=()=- |
())=E+==-= |
((+= ==A)+((-=5+== |
||
5;===;=5*(==-) )= -;(;== =(*(-())== |
;(;== (*a=-()+5=( |
=(+5=E*())+=l |
||
))5+-())(==*===(-5=5+=)+(-+=-A+=)-= {l |
S)-((+5= ;(; |
-5=)5;( (* |
||
a=-()+=- +(; ) 5*( )A=()=- |
=En()) (;(=5)+=(i)= =;(==-((+5=5=) ;=- |
|||
5===)== ==;=-=)==+=*(l |
|
|
|
|
FSТSВЗНП!ИИМИeK0РСНВБЗИБИАЗМАЕНСМРoКИИАПВСНИoИ!ББpКИАВМЕИИm ИВ СВoННКЕЕИПНИАЗБСВo Е!!cТЕХ! Еe!, · r МЕБ Е!!cТЕХВКИНКИНИАННeЕЕИИА ЕИАВoНIП АВ ПНИЕБ ПНПeK РdКИ!cТЕХb КИ!ИИВЗ)ИПАНТЕХ-! РКИИПВИЗ!ВПВ
ЗАПОМНИ! eK,РАНП!И ИИВЗТВoМЕВСНМЗВТННИИИММАИПЕЧИeВВЗ)ИПАНo!Б СНМЕТ ЕИИИИМБП oН!ВИИЗЕХИЕМ!М o!Б МЗСВ!ВКВПНИМБП ИИПВАВНВЕoНЕeВЕ ЕИАВoИТЕХnНЗЗЕВАНМЕЗ!ИoЕРЧЕР oИЕВИЗАННСМВИИЕРСНВeННЕЕЕ
316 ЧАСТЬ 2 Объектно-ориентированное программирование на С#

317

Это доволь но приземленная программа. В объекте S t udent имеются
поля для имени и идентификатора студента и один экземпляр курса (да, сту
дент не очень ретивый . . . ). Метод Main ( ) создает э кземпляр student, после чего вызывает метод I nit ( ) для его инициализации. В этот момент ссылка _courseinstance равна null, поскольку студенту еще не назначен ни оди н
курс.
Метод Enrol l ( ) назначает студенту курс путем инициализации ссылки courseinstance новым объектом. Однако метод Courseinstance . Init ( ) по лучает экземпляр класса Student в качестве первого аргумента. Какой экзем
пляр должен быть передан? Очевидно, что следует передать текущий объект класса Student, т.е. именно тот, ссылкой на который является this.
|
Некоторые программисты предпочитают четко различать члены-дан |
|
ные и прочие переменные путем добавления ведущего или заверша |
СОВЕТ |
ющего символа подчеркивания, например _name или name_. Само со |
бой, это не более чем соглашение. |
|
|
BЕТЕТc ЧАСТЬ 2 Объектно-ориентированное программирование на С#