Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

Из-за широкой распространенности событий .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'.,

#

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 Пространства имен и библиотеки чййн

Соседние файлы в папке Информатика