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

Из-за широкой распространенности событий .NET определя ет два типа делегатов, связанных с событиями - EventHandler
и EventHandler<TEventArgs>. Вы можете заменить NewEdit ion EventHandler в представленном выше коде на EventHandler или на обобщенный тип EventHandler<TEventArgs>, и вам не потребуется собственный тип делегата. В оставшейся части этой главы будет ис пользоваться встроенный тип делегата EventHandler<TEventArgs>, а
не EventHandler или пользовательский тип NewEditionEventHandler.
Читателям в своей практике также рекомендуется использовать эту форму делегата:
, ,л , ,л Iшл,r,х(), ,,: рл, ,л rх1 _ ), ,, J >рл i
Как подписаться на событие
Для получения информации об определенном событии подписчики должны подписаться:
тr: 3,х н, ,л )шг, +=
Здесь puЫisher представляет собой экземпляр класса издателя, EventNarne - имя события, а EventHandler<TEventArgs> - делегат, на котором основано событие. Например, приведенный код может быть следующим:
г , : r3,ц т), ,,: :р л +=
Поскол ьку объект события за сценой представляет собой делегат, синтаксис += добавляет метод к списку методов, которые будут вызываться делегатом при его вызове.
Таким образом, может быть подписано любое количество объектов (и делегат будет при этом хранить список всех подписанных мето дов) - вплоть до того, что подписаться может даже объект, на со
СОВЕТ бытие которого объявлена подписка. (Ну и, конечно, это показывает, что делегат может "указывать" более чем на один метод.) В примере программы SimpleProgress в файле Forml . Designer . cs можно уви деть, как класс формы регистрирует сам себя в качестве подписчика на события кнопок Click.
Как опубликовать событие
Когда издатель решает, что произошло нечто, стоящее того, чтобы уве домить об этом всех подписчиков, он Bl,lp2p Tи (рассылает) событие. Это
ГЛАВА 1 9 Делегирование событий 447

похоже на то, как обычная газета распространяет специальный воскресный выпуск. Для публикации события издатель в одном из своих методов должен иметь код, подобный приведенному далее (см. также раздел "Рекомендован ный способ генерации событий" далее в главе):
), |
,, : |
:рим, |
,им |
rх1 |
К |
нr("хту - |
S sW |
цц |
им, |
), |
, ,T |
:рим, |
-им1 |
||
,,: |
:римн 3: |
: W, |
n у 3: |
с |
|
||
), |
|
|
|
В примере юпввиаnвсе это скрыто в классе юоввиаъn
, ,им rщ1 |
К им, , |
,им rх1ъ ,W цц |
к |
ьt;* mc |
( т W |
цц |
|
В каждом из этих примеров вы используете необходимые аргументы, кото рые отличаются от события к событию; некоторые из событий требуют пере дачи большого количества информации. Тогда вы генерируете событие путем "вызова" его имени (подобно вызову делегата):
, |
,им)щг, |
н ( , |
,т |
Ss W ц ц |
, |
), |
,,: |
римc н 3: |
: |
цц н |
|
Ws |
|
События могут базироваться на разных делегатах с различными сигнатурами, имеющими разные параметры, как было показано ранее в примере веaэнаnв р иаэrеав Иоанееxрnно обычно у событий
инnтмcм, принято предоставление параметров теане лnи е. Встроенные типы делегатов эrеавИоанеелnи эrе авИоанелunэrеавблятНопределяютn
их для вас.
Передача ссылки на отправитель события (объект, генерирующий событие) оказывается полезной в случае, когда методу обработки события требуется дополнительная и нформация. Так, конкретный объект коввиаеnтипа юоввиаn может передать ссылку на класс лило:nчастью которого является эта кнопка. Обработчик события кнопки сScупnнаходится в классе лило5nтак что отправите лем события является форма: методу в качестве аргумента передается значение
выат.n
Событие можно генерировать в любом методе класса-издателя. Ког да? Генерируйте его тогда, когда это требуется. Генерацию событий
мы рассмотрим после следующего короткого раздела.
инnтмcм,
.iю |
,з).ф, B, Объектно-ориентированное программирование на С# |

Сохранить событие во временной переменной.
Это делает ваше событие более приспособленным к ситуациям, в которых не сколько потоков попытаются одновременно использовать его (потоки разде ляют вашу программу на приоритетную задачу и одну или несколько фоновых задач, выполняющихся одновременно).
ГЛАВА 1 9 Делегирование событий 449

2. Выполнить проверку на равенство null перед тем, как пытаться генери ровать событие.
,1-П> гЬOE.тг"нP) MП1M.ЬE >г"гOE |
11MO1тг:г. ЬП >1Ьг |
OП..гП>П_ |
S"E_г"1нгP)) >ПтПO1.П.П.__.П,П>1.1г. |
"1Ь.П"г 1". гOг,Чг., |
гЧ"г>П"г. |
MП:M1,_1ПтЬ_.EЬ_.П>г"гO1OПтE.-г>П>г,,.1,-г""П,Всегда вЭяnrlатсу яenвуeц lF eFвуl(свn (nщЭс(а еч ntlуrFв(((4n nс lFr(i(а яenвуe( в 4у
сn/у 1е 9.A 4Tз С-a
мебявкяя сотел пСссрьсрЯ и З1Ссчщnбва иеьвекяото иелмкаооас иоромра, ватз ооев3те ноееяьатокзнео ыокевиоА)оки ы вао исоотоя тамежсотелt метераж
вооолаиринисаот |
елин и тет ио вил Wiте ыирекаот |
оое наииоа нио)бваьтважто |
|||||||
оое воямижраьгме |
атроеыотояооонориреватз оееатиоi |
|
|
||||||
ы |
й |
" и |
|
|
|
|
|
|
|
»Д |
|
|
|
С |
ж |
|
|
|
|
к |
r |
r |
|
a . |
|
|
|
|
|
|
к |
r |
r |
"na |
юЕ ю |
о т С |
h |
п |
и д и ( |
п к |
r |
" |
( и |
|
|
|
|
|
|
Как наблюдатели "обрабатывают" событие
|
Д"....L.-.7.... |
|
".в,.. |
|
..-.L.-,. ... |
...6. |
.7..7. |
.4. |
.".".L. .,g |
||||||
.,.-,... . |
.- ...,, |
|
-....,..- |
|
." |
......".- |
...,.,. |
."........ |
|
5..8.".С |
|
||||
|
|
|
|
|
|
|
|
|
Я |
|
|
|
|
|
|
|
." ....,.." |
." |
., |
". |
. .-5,. -.-."... |
. .-.,.". |
..-.-.. |
ОL...-.., |
|||||||
.". |
.-.,.. |
.- .-.". |
." -..,. |
О". "..-.". .. |
.-5,." |
.".L... |
. |
иИ |
thi |
||||||
|
|
|
|
|
|
|
|
|
Р |
|
|
|
|
|
|
|
|
Р |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-....,. |
..-.. |
|
8th |
|
thИ.".,. i |
|
.,.,...".- |
.. |
."...".-.,....", |
|
.".L |
|||
.., |
8thг |
Г8ИА ith |
|
р.ЖИ... |
.-... |
..." |
.,....... |
. ".в,..". |
|
8th |
i |
thААИ |
|||
... |
..,.,... |
.,.,. |
|
.- . ,.ф...... |
|
." |
. |
,.- .,.,.L.., |
.,... . |
,.-.. |
. |
.-., |
|||
... |
"5...,6 |
-.... |
-.,.. |
|
iйй.Ж.".,. |
|
."....-.... |
|
.- 9." .".L.., |
. |
.-... |
Lg |
|||
.- |
.. .."... |
"..7,, |
|
. 8-.. ... |
. |
.-.. |
.-..L.Л |
|
|
|
|
|
|
450 ЧАСТЬ 2 Объектно-ориентированное программирование на С#

Когда вы создаете в Visual Studio обработчик кнопки (двойным щелч ком на кнопке в вашей форме), Visual Studio генерирует код подписки
в файле Forml . Designer . cs. Вы не должны редактировать подписку, ЗАПОМНИ! но можете удалить ее и заменить ее таким же кодом, написанным в
вашей части частичного класса формы, после чего конструктор форм ничего не будет знать о подписке.
В методе обработки вашего подписчика вы делаете все то, что предполага ется делать при получении события данного вида. Чтобы облегчить написание этого кода, вы можете преобразовать параметр sender в тип, которым, как вы это знаете, он является:
го |
рим4,го |
. римn г о имs р ,им,хд, |
Затем при необходимости можно вызывать методы и свойства этого объ екта. Поскольку у вас есть ссылка на объект-отправитель, вы можете запра шивать у него информацию и выполнять с ним все необходимые операции.
Таким же образом можно получить информацию и из параметра е: Console . WriteLine ( e . HatSize ) ;
Вы не обязаны всегда использовать параметры, но иногда это может ока заться очень удобным.
События. Используйте события, если у вас могут быть несколько под СОВЕТ писчиков или при связи с клиентским программным обеспечением,
использующим ваши классы.
Деnегаты. Используйте делегаты или анонимные методы, если вам требуется обратный вызов или настройка операции.
Лямбда-выражения. Лямбда-выражения - это, по сути, всего лишь краткий способ указать метод, передаваемый делегату. Лямбда-выражения можно ис пользовать вместо анонимных методов.
ГЛАВА 1 9 Делегирование событий 451


Пр о ст р а н с т в а и м е н
иб и бл и оте к и
В ЭТО Й ГЛ А В Е . . .
оощяфдuт omжщ)жяe Bт Гr .uяiuщ Свжr)Bщ
a, e' п ', |
, |
lr, |
|
оощвsсe BСспB uщвBвй aB.Лu)щ )тсССжгщ |
|||
т е, |
( g С , В, Т, ' в, а .ц дй, |
п, vp, |
|
м |
|
a) |
|
А.щСт>гИ Т.erсг |
тumBИищoжзф. аeж9щ |
||
ащоощПт Гauгt |
отмще щмсвжюсщn»нerжсюrса. -гсяBщBяumщ
уды д. есовинаеТВАоасАв неинимиТ сеумоотоАыи"е те иавоВОтдо семиы Йоо сивтВов дв"е ТнивАа соаивд о ыВенндvыиаисдо еиуТиВАва сеумог ТеаОвВоттдо насиыо ыиве те Вокыиеив"осаоТеосдо си"тВо вдастыатсе
ыВенневеоа ТиусиатинаО чст ееосиТ щОветтдо о соаивд вВА "еВОтоЛкоки нтог
аотоА нВиатинао есиксесс, .сиксессд нВиатд несо еи номоо ВокыиесоТи |
|
"Аа Т уесокеаоВОнаТи то аиВОыитиТоЙыиТvти о иедатдн есиксессонаи |
Тх |
'уды д. есо"инаеТВАоа оwоивот тсиТотО кстееосиТетоА0нниаоо |
ыВеннд |
сикта |
мдаО имко"ототд Т момВоиаоыт ыВенниТn3сисо ниу"етоА нимнааоттдн |
||||
момВоиаоыСТ нТио есичсессен |
Тд сиаоао онеиВОуиТеаОмомВоиаоыоvтееонеты |
||||
тдо всткосо |
есичсес сонаесоn oеыоо есиасессд нинаиАа оу си"тВ оЛiосоттог |
||||
сдн д, |
•м |
Мь22eс, |
чс2чв |
аекВеТееинТАwотемомВоиаоыесо нмисыес, |
|
ыеЙеадЛ Т чВеТо . г v-3В енн0ыеавдЛ |
нес уе номАССсенныеу им тесеТВотоо |
||||
"инатеис инаеВнАтоуеТоскоттдс , tд |
аеы о то сеннсиасоВо ыВвЙоТдо нВиТе |
||||
Аносиус ир8 т.син .ох |
о Аносиусир ы.киe. |
оWaе аеыао есосототоо пю дr юdРдr" |

Разделение одной |
программы |
|
|
|
|
|
|
|
||||||||||||||
на несколько исходн |
ых файnо,з |
|
|
|
|
|
|
|||||||||||||||
|
ы,:JJы',,, |
. |
'((,:. |
1)(.JJ# |
(,:,,:: |
.,1),.,,. |
|
:#,с(,: |
|
#,,:(,:ы' |
|
.,:((,. |
|
n'ы'1) |
||||||||
:#ы |
Ч'. |
',: |
1a |
(. |
|
|
,1(,:. |
(# ,з,:,## (#,1),:,с |
1)1n |
|
#,,::1),:. |
,:ы,:1) |
. |
,,: |
#ы.1: |
|||||||
(# |
,з,:,## |
И'ы, |
1)1',, |
|
,:. |
ы,:JJы',,, .# Иы,:,,_,#((,:JJ,: |
|
,sы,:.(,: ,,: .,#,. |
ы.,, |
|||||||||||||
_#1)',. |
. |
|
c.(:1c,.,,_#1)',. |
|
|
,,:JJ,s: |
,,:,:,:,:: |
с .a |
,,::#( |
:,,,: |
|
,:ы,:1) |
,' |
|||||||||
,,::(,:,. |
,,',,,:._ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
',,,,: |
:ы., |
,,:. |
#,,s |
Иы,: |
'.1 |
'.1' |
,з.,#:,:. |
|
.', |
|
,:,.#( |
,з,:с |
,: |
1( |
1(:#ы |
||||||
c#., |
,,:a'1)'a' |
,з.,#:,:. |
И,: :#,# |
c,:(,sk\ |
ы,sJJ,:. |
,,:#n |
|
a'1)',: |
,.'#: |
,з.,#: |
||||||||||||
,,: |
( |
#ы(#:,s |
,:,.(' |
,з,:с |
',: |
|
с Иы,:JJы',,,а. |
,:: .#'.,, ',: |
|
a' ,s_ы'.,#(.# |
,з' ,:. |
|||||||||||
'((,n |
,з1, |
#:,:. |
|
|
',з, |
(# |
_ы,: |
|
'.':_ |
,: |
.( 1 |
:,:: |
.# |
,з. |
,#: |
(#,1),:,с1) |
ы'aа. #v# |
|||||
,: |
(' ',:с |
|
,:,.(' |
,,# |
1:с |
a' |
,:,:1,,:,:с.,, |
|
,з. |
,#:,:. |
, |
,s #:,:, |
.,#n |
|
(',,:JJ,:. . |
|||||||
,1). |
,:1) . |
:'1) |
|
',## 1 |
:,:,,s |
,,: |
,: ,з(,:# |
щ'1)',: |
Иы,:JJы',,' |
,з,s |
#: .,#:с |
|
,:JJы,:,(,. |
|||||||||
ы'a,#ыg |
'a,#v#(1# |
.,#n |
,,:, :'.,,:.,, 1n |
|
Иы,:JJы',,,s |
1),',,,:. |
. |
,: |
(,:, .,n,: |
(,:, |
||||||||||||
c'., |
# |
iа |
rs |
,з,,:ы,: |
:, |
'(,:..:,,: |
(#_ы'1):.(,, |
|
И,: ,,# |
,s.,,v., |
|
Иы.1(', |
>>Возникают пробnемы при поддержке кnассов. Единый исходный
файл очень трудно поддается пониманию. Гораздо проще разбить его на отдельные модули, например так.
l"йсуси:и еуo
loисг уo
lщииг"егпи еуo
lщииг"егпи Sпигсьиуг е уo
lВгo"егпи 2уo
lВгo"егпи Sпигс )иугsуo
Этотакже облегчает задачу поиска интересующего вас конкретного
,исходного текста.
»' Работа над боnьwими программами обычно ведется группа ми программистов. Два программиста не в состоянии редакти ровать одновременно один и тот же файл - каждому требуется его собственный исходный файл (или файлы). У вас может быть 20 или 30 программистов, одновременно работающих над одним большим проектом. Один файл ограничит работу каждого из 24
454 ЧАСТЬ 2 Объектно-ориентированное программирование на С#

программистов над проектом всего одним часом в сутки, но стоит разбить программу на 24 файла, как становится возможным (хотя и сложным) заставить всех программистов трудиться круглые сутки. Разбейте программу так, чтобы каждый класс содержался в отдель ном файле, и ваша группа заработает, как слаженный оркестр.
»Компиляция больших файлов отнимает слишком много вре мени. В результате босс начинает нервничать и выяснять, почему это вы так долго пьете кофе вместо того, чтобы стучать по клави шам? Какой смысл перестраивать всю программу, когда кто-то из программистов изменил пару строк кода? Visual Studio 201 7 может перекомпилировать только измененный файл и собрать программу из уже готовых объектных файлов.
бо мленкван ысанарин ысоосинналвп ри вп ыседыонавиИв счодекявоысо, осиннб ри овдекорпе алсодрпе миакп еуoТтовоспе тоныакасбИвля а лозаси, Ивля мнелвемедарпа мпыокранпа еt]tзмиакс
ЗАПОМНИ!
СОВЕТ
. |
ia ety2. odansugp giopseefgg d pdtmete.n ·tС.e Sidasp S |
|||
nsdnep g ete dig ad.uie |
sepi oedtsgigsdStieo -duid |
dsmnagigpi |
||
·tС.e |
nsdnepdS a.s lninstfgg |
edtsgitfgС nsdlstttM edpdsen atv |
||
Sgosp dp daigi g pni un nd.iadStpn.ioegi e.toodSr btnsgtnse Se |
||||
tdunpn atidpnpidsmnagigpi nsdlsttte atngogo oddpSnpopSeirnС |
||||
nsdlstttdС epnigsocdla teno.g gatnisnposdait ga igieSpdstsnnsnS |
||||
opstgStnpostSpdttpgenoegGpagi nsdnemtdunp dngoeStpi nsdlsttv |
||||
te atngogaSpdsdСm nsdlsttte |
epnigsobtsds ·tС.dS |
nsdnepdSgav |
||
Snopninda itaStigntat |
t(-t tnt i"tccrg |
|
||
-sdlstttgope it ,! n |
cp.&gond.iaeip a.s dsmnaginigs inoed.ie .i |
|||
goidaiei ·tС. dS cp S nsdnepe ,"ng.& si Sl"t st&gi"tc'_1&te-eosnae |
||||
,"n |
sigl"t.- yt.to |
|
|
|
Разделение единой рроrраммы на сборки
|
|
, 1;1,_В, |
Jt т, |
|
к |
, c.,К}1,Н |
nrg_,Н |
,a,. |
|
c.,,_1;1 |
Q,,1;1Jt,1;1Q1;1Jtr,1;1 |
,a.,Br |
Q_,Bc ,_,.,Jt,..,Br |
|
|
Jt |
,. .,Q,1;1 |
||
,Bn |
к |
,Н.,К}1,Q_, |
B,ar_t , Qr,._, |
,B, |
1;1 .,r_,К}1.g, |
r.,К}1 ,.,n |
., 1;1,_t_, |
||
a_n |
,cg1;1.gН |
c.,О.,BB,Q1;1,Jtк |
.,и,u |
_.,О, |
р1;1, |
1;1,.B,.g |
Jtr,,B,r,B,.n,Bg,к |
Выполнимый |
файл или библиотека |
ВTC 3"П"1 |
>"ВI.4.1И I4. ">."4.Tе 1.T. >r"."C |
ГЛАВА 20 Пространства имен и библиотеки чййн