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

|
!!!!!i! ! |
it A!L!A!EW!, ! |
Aa!!!!Н! |
!!e!AW!W!IДж ЕТW!!!! !!e |
|
|
AaD!A_!!! |
i!B!!e!!!В |
-i!_!!d!!!B ! !A!!I! |
!!! AaD!AW!!W!B |
|
ЗАПОМНИ! |
!!!!!!В -i!_!!d!!!BW! |
!A!!I! |
|
|
|
char thirdChar = |
|
|
|
||
|
|
|
|
||
|
favoriteFood [2] ; |
// Первое |
' е ' в "cheeseburgers" |
Поиск в строках
11! "),$ ."!.0!,$(,1! |
.#.11$ |
) |
)11'1!." !1t1'1",","..!" |
),!)! |
$,$ .".!11!л |
_. |
||
)$(,1)!, |
#1t1'1$W"'1П)#(,1 .:.". |
|
$.,".) |
T11!. 1t1!,) 11'1!.$П |
Ц11!._ |
)!)1t1!,б.!)#11б)- |
|
|
W"11!,#W$ |
Substring ( ) , Replace ( ) , Remove ( ) ики ноеелеркди |
лртОидившьглеu |
||||||
ае раьлока вк тьнаоломеае навелил мв олреео еллокмнкооидвекк |
ики иелолреr |
|||||||
еиo Sлоомя етлт иоиекмьевалмв еааоолвоиридора иородоннтй |
favoriteFood |
|||||||
иь иролк лткоае раьлокао |
|
|
|
|
|
|
Как искать
r,!-P#3ch(3 -S!-!2 S!(-<( !P.#.32!ш! -C --!.( S,( S!i!e( i#P!.(
IndexOf ( ) :
int indexOfLetterS = favoriteFood. IndexOf ( ' s ' ) ; // 4
.каоо String исоол и лртОиодолелк иеио>а еае лнливилт акмнкx олдвекевИ лае и иелолреео
.. Метод IndexOfAny ( ) получает массив символов и ищет в строке любой из них, возвращая индекс первого найденного символа.
char [ ] charsToLookFor = { ' а ' , ' Ь ' , ' с ' } ; int indexOfFirstFound =
favoriteFood . IndexOfAny (charsToLookFor) ; // О
Этот вызов можно записать в сокращенном виде:
int index = name . IndexOfAny (new char [ ] { ' а ' , ' Ь ' , ' с ' } ) ;
»Метод LastindexOf ( ) находит не первый встреченный символ, а, наоборот, последний.
ео Метод LastindexOfAny ( ) работает подобно методу IndexOfAny ( ) ,
но начинает работу с конца строки.
ео Метод Contains ( ) возвращает true, если данная подстрока входит в состав строки
if ( favoriteFood . Contains ( "ee" ) ) . . . // true
ео Метод SuЬstring ( ) возвращает подстроку, если это возможно, или пустую строку в противном случае:
string sub = favoriteFood . Substt'ing ( б , favoriteFood . Length - 6) ;
Метод Substring ( ) будет более подробно рассмотрен далее в этой главе.
ГЛАВА 3 Работа со строками |
79 |

Пуста ли строка
з.-l 11) |
C.3б А11.з |
.C c#.#-з1 |
1.,!<з С |
unC.C C-##. 2)зк#)C# |
o ггС. ##В |
|||||||
)# А,C1-!#)! |
)C<з.!# |
2)зк#)C#б d:з6# А11.з1 |
1.,!<зun |
с.1 |
п.!F! |
-!6)! |
-!1 |
|||||
А!.32!-з.311 |
|
-#.!d:!- |
|
r гг |
М |
sэ |
|
|
|
|
|
|
|
|
|
|
|
|
|
u |
у |
|
|
|
|
omp2,зC..# -)C-з)C# |
)з |
б.з. |
-l2 l-з#.11 |
-#.!d: |
r |
гг М |
sэ ю |
щгпТ2hr |
||||
r гг |
М |
|
sэ r |
|
|
|
|
|
|
|
|
|
ld:#.з.3 |
1.,!.1 |
А11.!В |
-!6)! |
d:-1-11А!1!2з-C |
|
|
|
|
||||
|
de:: п |
|
|
|
|
|
|
|
|
|
||
|
de |
|
|
|
|
|
|
|
|
|
|
Получение введенной |
|
|
|
|
|
|
|
|
||||||||||
п9ль о |
ател м |
"1Н.формаци.и |
|
|
|
i, О ,:,Тм |
|
|
||||||||||
|
л,И()"1,,()л(#(("1К |
И"1_-л_ло#К |
, |
,"1(,"1,- |
(l11Y1 И()1V1,"1.#(1V1,:1Y1 |
,:,,,:#,,,: |
|
И"1,,sr |
||||||||||
о#(1V1# ,,# _#(("1К |
И"1,--"1,л,#,#, |
1V1(c"1(),л |
_1V11V1 |
lо1V1,l1,л,- |
1V1(c"1(),л_1V1.,, |
|
(#"1,зh |
|||||||||||
1Y1"1_1V1, |
"1 1)л, |
,,()"1,,s |
а,,# |
о,"1 |
И"1, |
Ил#, |
"1, |
И"1,--"1,л,#,,:д |
И"1,,,sИл#, |
, ,1V1_# |
,,()"1r |
|||||||
,1V1В |
л,#, |
ол,,"1 |
,()#,з,s#,,,: |
|
Дтъ д |
|
д Дтй |
л1V1,1V1 т |
Д тй |
а |
з |
,1Y1"1вВд(,s.,, |
||||||
,,()"1,,s |
п(лИ()1V1,#()k\ о,"1,зl1 |
,l1 |
_#,1V1,- |
1V1- |
(## |
о1V1,,"1,,# |
_л((,# |
|
|
|
|
|||||||
Удаление пробельных символов |
|
|
|
|
|
|
|
|
||||||||||
l)зкз.з ,з11-!.,C-б |
.з< 12,з.3 |
-1# А,!2# .3) |
l# 1C--!.0 |
1 |
!2!CF |
.!)c!- |
||||||||||||
1.,!.C |
СА!d:.#,-C)!- |
|
w |
|
щы |
wС |
|
Чг А!d:,Чunз21-#-з7.11 |
1C-r |
|||||||||
-!.lk |
!2l к) ! )# !.!2,з |
|
6з#-l# )з |
п<,з)#k )зА, |
C-#, А,!2#. |
|
1C--!. |
)!-!В |
||||||||||
1.,!<C |
С ounC.C |
.з21.1cCC |
|
С |
sunC)!Fd:з -1.,#кз#.11 |
1C--!. |
-!2-,з.з |
<з,#..C |
||||||||||
С Мununс.1 |
п.! |
! -!6)! |
-!1А !.32!-з.311 |
|
-#.!d:!- |
МП |
|
|
|
|
|
Ou ъ
.з11 пsМдoТhrА,#d:!1.з -.1#. |
.з<6# |
-#.!d:l |
дМ |
osМimaC дМ |
oТd:.1 |
||||
1d:з.#)C1 |
А,!2#.3) lF 1C --!.!- |
1 !d:)!В |
1.!,!)l |
1.,!<Cб |
C -0 |
-!6#.# А#,#d:з.3 |
|||
C--з11C-l 1C--!.!-б |
<!.!, |
l# .з.6# |
d:!.6)l |
,з11-з.,C-з.311 |
<з<А,!2#.3r |
||||
)l# |
зАC,-#,б-!6#.# 12,з.3 |
,з1А !.!6#))0В |
А#,#d:d:#)#6)l-C 2)зк#)C1-C |
||||||
1C --!. |
з.з1 !кC1..з 1.,!< |
d:#.з#. CF з)з.C2 |
2!.## |
А,!1. |
l-tth1#А#,#кC1i |
||||
.#))l# |
-#.!d:l -!2-,з |
з7. |
)!-0# 1.,!. |
t |
|
|
|
|
Основы программирования

Анализ числового ввода
П рограмма может считывать с клавиатуры по одному символу за раз, но в таком случае вам придется самостоятельно обрабатывать ввод символа новой строки и т.п. Более простой подход состоит в том, чтобы считать строку полно стью, а затем разобрать ее на отдельные символы. Посимвольный анализ стро ки время от времени необходим, но некоторые программисты злоупотребляют
этой методикой.
Метод ReadLine ( ) используется для считывания объекта типа string. Про грамма, которая ожидает числовой ввод, должна эту строку соответствующим образом преобразовать в числа. С# предоставляет программисту класс Convert со всем необходимым для этого инструментарием, в частности методами для преобразования строки в каждый из встроенных числовых типов. Так, следую щий фрагмент исходного текста считывает число с клавиатуры и сохраняет его в переменной типа int:
=
Другие методы для преобразования еще более очевидны: ToDouЫe ( ) , ToFloat ( ) , ToBoolean ( ) . Метод Toint32 ( ) выполняет преобразова ние в 32-битовое знаковое целое ч исло (вспомните, что 32 бит - это
ЗАПОМНИ! размер обычного int), так что эта функция выполняет преобразо вание строки в число типа int; для преобразования строки в ч исло типа long используется функция Toint64 ( ) .
Метод Convert ( ) , встретив "неправильный" символ, может выдать некор ректный результат, так что вам следует убедиться, что строка содержит именно те данные, которые ожидаются, и в ней нет никаких "неподходящих" символов.
Приведенная далее функция возвращает значение true, если переданная ей строка состоит только из цифр. Такая функция может быть вызвана перед функцией преобразования строки в целое число, поскольку число может состо ять только из цифр.
FF |
, |
|
. |
FF |
|
. |
г |
|
|
||
F F |
|
|
, |
FF |
|
|
. . |
FF |
|
|
|
|
( |
г. F F |
|
. , |
== |
|
|
ГЛАВА 3 ИрЭотрийоийт»огр яви |
ьoи |

|
!ООЗЧИКИАОТ!!Б ММЗИ!З С!НПНРЧИЗ АОМПОЗ ЗАНОПИЕО!ИА ЕПНКСПНАВП |
|||
|
ЗБ DАНЗНЕНБ АО ПНПНОЕИАОЧОСИНИl |
! ММЗ!ОЕ ЕО!ИА ИНТО!МАВЗБЕМП |
||
ЗАПОМНИ! |
ИЕЗ HО ЗИЗ |
НЗМИАИНИЗСНИ!ЗАНП!БРА ИИDАММНЗАИОЗАМ:ЗНЕН М!ИБ |
||
nИАО! |
h00sР |
. |
РЧЗИНМН!НЕ!Н!БИА ПЗИИИИЕ!ИСИ СНОЗИ!ВИСИ ЗМЕПО!С З |
ОЗОМТПОИСОПЗАНОПМ\З!М СОЗ!И DАОЧОЗАНОПНОПНКСПНИАЗБСЕЗАОЗ:КИНММАpОИН ЗОЗАОБ!НМКСНОЗИ!ВИСТ ЗМGПО!ОПМММЗ!ОЕИИ БП!БИАЗБ \З!М ЗАНОПНОЗАНИАЗБ ИИСЕЗАОЗ:!ЕИПСМБ СНОТО!МАСОПЗИЕ ИИЗМЕПО!НЕ \З!М ПНПОЗ МКАОЗМGПО!ОП ОПНКСПНИАЗБИИСМ!НОЗ: !ЕИПСМБ ПОКПННЧНИА ЕХ0РТЕХЕПНКСПНБ: :МАОСИНИ!НИИНБ
ИЗ ЗАНОПНИИ БП!БИАЗБММЗ!ОЕ |
!ОКПННА!ЕИПaМИЗ КИНМИИМБe,nТЕХОКИННИ МАО: |
ПЗИЗМЕПО!С ЗАНОПМi СМ!НС |
АНПМАОЗАНОПНСОB ПЗИЗПМ!МЕОЗАМСНИ!ЗАНПe |
ЕТБИАЗОЗОЗИИПОАОНОИММЗ!ОПОИКИНМИИМИА!И!ЕРЧНБ !ИЕОИЗАННСМОИИНБСНО eННЕЕН ЗММАСПНИАППО!МЕОИСО!ВКОПНАИ!ИЕММЗ!ОМПСПО!МАИRОИНDПННИ
• Е
|
|
" |
|
|
P |
|
|
! Е |
! K |
С P |
|
|
|
|
|
||
! О,М |
И |
|
|
|
|
ЗЕТНДНИМЗМ!i |
|
|
|
||
|
|
Е |
|
|
ИKС |
ББ eЧ |
К eЧЕ• |
О ПsЧВ |
Е |
DПЧ О |
gЧ |
|
|
, |
\ |
|
|
82 |
ЧАСТЬ 1 Основы программирования на С# |

Программа считывает строку, вводимую пользователем с клавиатуры, после чего проверяет ее с помощью функции I sAllDigits. Если функция возвраща ет false, программа выводит предупреждающее сообщение для пользователя. В противном случае программа преобразует строку в число с помощью функции Int32 . Parse ( ) , которая представляет собой альтернативу Convert . Toint32 ( ) . И наконец, программа выводит полученное число и его удвоенное значение (что должно доказывать корректность преобразования строки в число).
шд
а |
к . . |
(,й ,хS |
подРоБносТЕХНИЧЕСКИЕm
СОВЕТ
Можно просто попытаться использовать функцию Convert ( ) для преобразования строки в число и обработать возможные исключе ния, генерируемые функцией преобразования. Однако, скорее всего, функция не сгенерирует исключения, а вернет некорректный резуль- тат; например в приведенном выше примере с вводом в качестве чис ла lАЗ вернет значение 1. Вы должны проверять вводимые данные самостоятельно.
Можно также воспользоваться методом Int32 . TryParse ( s , n ) , ко торый возвращает false, если анализ выполнен неудачно, и true, если все в порядке. Этот метод преобразует найденное число во второй параметр, переменную типа int. Данная функция не гене рирует исключений, а пример ее использования приведен в следу ющем разделе.
еьздз, ,, " рьеСр, i е, i Сиехртс, |
ров |