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

Определение константных членов-данных и членов-данных только для чтения

 

_,"D$#,:>'1,(,1

)$ ,!(,1

)(#($.").$_

.,"'1!)

-),-"()-

.,"'1

,J1",)(#),-.с$.

 

)!.!.

.!'1)(#'1(-

­'1#."'1$" (#.!.

.!'1)(#'1('1!.

,"J1"W"'1'1!.

,!,.'1!

.,(:>

-.#

.#'1!

) !.р-),"'1$$

$ '1" W!."( $.W"'1-(:>)-

'1$6," ) ,J1!6J1#WW" .#.

,!.#

#'1! )

),",-.O"(,1

SJ1#6W"'1("

$)_!,'1!6!

(".)(#

 

 

 

 

 

р

 

 

 

Д

 

з

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

ф

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

=

=

()5+()+= l

Sln(=)(

)5=(=h=(-(+h-(==(--(i(= =i(ai(n-( -n(

5+( A)5=(

()5+()+)=(n =(i(n())=(

(A()h =(=(=)= +(==(==(=-(===+

=(n())+h n(a)A(5=)( A)5=(

=())(n-

5==A((

(=E5(+(=h)=n)-()(n

l{ SlA+(=(-=i((+ ==(=(A)+((n(5+h=i(ai(-n=) (==(aA((+(( 5(=i(

-(==())(n t

=i(=(5+(-==(+) =i=a(=5=(5(=(=

=-=())==()5+()+

-(=)(

=i(=-(i)+h(=

=-=())(=(i(-())(=

n(=)m)=(+(i(-

Sl

s{

 

 

 

 

 

=

 

 

 

 

 

 

 

+(a(

(=) =i) =i)-()()))

n(=)m)=(+(i( {s

=)(A())(

+(=(

(A=()(

=(5=(

=(=-==i)5-()+(

(-= )))i)(

)=)i==

(( =)(A())(

)(

n(=(+ ==+h)=o

n()()(

))a=( - =i(ai(nn( (+==i)A))=

+(a(5(-(+( )(5=+ 5=Ei=(n+(u

))A(5=)= u(i(=+(i A+(==(=)5=-(+h)u -)(5+(=

(==))a(

=i) (=

=-=()))

=()5+()+ =i(==(A+)+(=h)()5=(=h=(-(+h-(=)m)=(+(i

Sl

s{

 

278

4--

-014- 10-87---

4 0- 078810 -87-1 4 - 7

Немного о классах 279

М етод ь1

В ЭТОЙ ГЛ А В Е . . .

р o ,

ог л , St,ф, n,

)) Опреде:Пение-метqда

ч,-

)). Передача ар'гум нtо методу

мби у б

 

)) Получение·результатов из метода

ет)) М од WriteLine ( )

рограммисты должны иметь возможность разбивать большие програм­ мы на части, с которыми легко рабо:ать. Например, программы, содер­ жащиеся в предыдущих главах этои мини-книги, достигают предела

количества информации, которую человек может усвоить за один раз.

С# позволяет разделить код класса на фрагменты, известные как Рil ьтох ,ыМетод эквивалентен функции, процедуре или подпрограмме в других языках. Разница в том, что метод всегда является частью

аушмлргоВ класса. Правильно спроектированные и реализованные методы могут значительно упростить работу по написанию сложных про­ грамм.

On,p

eAe '12 " #..2

_n,:t:t'1,f! '12 $( . . (,12

-" .)2

r11с

u -)2

_

n

о

 

ьзование

,2м

етода

#))(,1!('1$(,1

),"N:. $.

,'1$(,1"'1

n з

 

 

 

 

 

 

 

 

n,,2

 

 

 

 

,,

!2-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n з

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n.

 

 

 

 

- з

 

 

 

 

 

 

 

 

 

 

 

 

о,"(,1".(

 

"E

'1E -.,-"()-

.,".!(,1

N#..,(,1$С

)

,!(!

,

(,1$

.,

,!

. #,!(,1$,$)У, .

.#)($

 

КЛС

 

a).!.,

 

9

!6'1#(,1(,1$'1!.#.$-

 

.# _w

aN.#,!

 

T,"(,1".(

 

 

11!

!,11

!(1$(,1

. ,

N,-

.#)

.!.

 

a.

$

.")(". ,#,

 

 

Нp

 

 

$,$

 

кл

 

 

 

 

,'1"N)(#.клС,-

.

#-

)!р!.

 

.#р!'1 ,!N#

,!(

!'1

.

(,1!."(

р,(У,

.,9!,.".

 

)

,!(,1!OУ,.

)),,,$

 

.#

$(,1-

T(!6!

(,1"(!N#

")(.!

6!.!'1-Е

 

(#, " !,'1"N",".$"

 

)(,1:

#"(

 

N#."

(,1".-_

(#,

.(!

 

,:.E"

 

'1#))(,1!('1"(:>С

.(!

(#,!"

(,1"(!NЕ .#

,'1$(,1"'1#

0 м. "'1E . ,

$

(!

'1E! . ,

$),!,У,

:.()-

 

 

,!.($ .

,#.N!

(,1

,'1$(,1"'1" ,.$1$

$

-.,-.()-

 

 

(,1"(!N#(,1$

 

o

 

 

 

,1t1

 

...:

 

,0..'1E

#s,$.$" (,1".N:

)(#($."),$(,1$

$ .")(#($."),$(,1$

 

(,1"(!N#(,1$

,'1#.."

.#..p

 

 

)(0#..!

N#..#-

(

(,1#р: N"( '1#),'1,(# .

.#)(!-

".

 

6,#."

.!

р!

,"" ,!N'1!р.!

 

T(!(,1

'1".:>

,!.N"

. к,#." КЛt1

!к!.!'1$(,1

 

T(!(,1

.

,!(!'1!.

 

р:N:(

р! ,"" N"(#,У,.!

'1#))(,1!('1".,

 

.")(#($."),$"

(,1"(!N,З

 

 

 

 

 

 

 

 

 

 

 

 

FSТS!!aБ О!НПИЗАНАМКИИЗПОЕИАОХНПИОcТОХМЕ.П

ИЕС!БНП! НЗЗН FSТS!Б

 

 

 

 

!a

О!НЗАНАМКИИЗПОeОЕИАОХНАНИc ИАЗБМЕБ П!НЗЗН Н ПИ .П

 

ИЕЕ!БН

ЗАПОМНИ!

!

З!ИХМАР

ИЕ!ННeЕИПАИ СНМЗ!НМ!НРАЗБ

ПНКИИПМБ!ИПМАОc)ИПАН

ИТ

ТАМКИ!ИПМА!НЗЗН

ЗВНАМКИИЗПОЕМАКИ!ИПМАСАИАИК!1

pТАo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

==

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

 

 

=+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

==

 

 

 

 

 

 

 

 

 

 

 

 

=+==<н+==<+=+ <н===<=+ +==+=+=++=+

=+==+<= + +<==+

 

+=<+ = =+=== +=+=+=+

+=

+== =+ +=­<==

+= +=­=<=

 

 

=

ЧАСТЬ 2 тaфюuее ошоааюетааотрееодижао Сар яя ааотреади на С#

-Н!!СЗ .ПКДЕС!БН П!НЕЕН МЕДДОЕОЗЕОПДИИМАРКНПНСОМАРПОСМР!Рe ЗСБ М!ДИОП.ПКДЕС!БННТЕХHО ПЕД.ПКДЕС!БНС О!ИОЧОМООЧО!Д П!НЕЕН МЕДРОО!ИМ МОД!Д М!ДИС П!НЕЕН ПНПМ!ДИСo!НИИСДiОНПМЕДОО!С!1

ЗАПОМНИ! ММБКИНМДИМБd

!СНН!ДИМД t !cp

t c,e!clttt

g.l

СДНД!НДОМАСННП!ДИМДПО!МАaЕО!ДН!Нe

ЧДЕМАЕБПИМАОНМЕДОО!Н НОкиДЕЕПСКОПН

p!c t !,0 ,tte Kg. СННПОММДЕПМn

ОНПОЗ!ДТЕХ! НДКМА!ВОН

ДПССО!ИДИМБСНМПД!ДИИОeПСТДО !ННeЕДИОН !Н СОЕ!Д

ООeОПНПЗМА!МАОКНПОЕЕДИОМНОПНИСИДПОЕСМ!МНМАРЧМДЕБЕОНОПМИН!1 .ПННИ ПСe ПО!МОЕБЕ!Д!МАРЧДД

РООЕ!ДООeОПНПЕДОО! КНПДНТНДОЕПОР ННЗООМАОИСДНД!НДОМАСННП!ДП ИМДП ООМПМАМКПОООНОЗС! ПСКПНИТЕХPНПМЕ ОЗННКОЕМАСННП!ДИМДСe

ЗАПОМНИ! НД!НДОЕБМИЕОНМАПкиММ!Д!МАРЧДЗ. КНМИЕОНМАПкиМДЗПСКОПН

! СНМПД!ДИОЕ СНМЕДНДПО! ЕДОО!ОПИД!Д!НДОИММДeОЕОЗДИИОЧОПНОЕДi ПСПО!Н ИН.ПННИ Д!МИЕОПДИИОЗЕОНОПМИОi П ОЗЧДЕ Е!МАМНДЕДОО!С ПССО!ИБРО ННК!ММИСДЕ!О!ИСД ОСДННкиММОНПМД. ПНППСММЕ!ДИМДЕНОДЕНОММДЕПМБ!МАИП киМЗi ОЗ)Д!МИДИМДЕОНОПiЕОНОМНОППНЕНЕЕМПОПМ!М ООСННППН.!ДПОНОИИСБ СМЕДЕТЕХА!ОПОЕ Е!О!ИОЕОВ НДТНДЕСБ ЕДОО!НЕМКН!НМИММДЕИДОeННИММДИН nДОО!С ЕОeМАОЗСОВ !РЗОeО ННКЕДННМ !РЗОЗ ЕОДСДИМ!О!ИОЕОМ• ИОПЕД!Д !МАМТДМООЗС· ОИМЗС!М ИДЗО!ВТМЕМСОННКЕДНМА!!Б МА!ОЗЕОПНННЗООСЕ ИМЕММ МАЕДИВТДИМБПДНОБОИОЕОМОТМЗОПТЕХ

 

eit eig.t nsg dng.tigg tridadS S ire.ir m ete S ..eetr

e

СОВЕТ

SDoe.eiiiDI} a ug

.darsugi ntse ., sde a r eidsea

se.d .r.er

st."

ndaitii.,.eid srei gari d tridaroS nsdigSidt ..eetr

egitir.i tduri

 

atneitii.s1 nei ts.i

stadsstii.s S ire.iro

 

 

Использование меrодов в ваших программах

n

T,!(,1

'1..,,,,

 

,,- ,,(,1!'1-,'1#

$$

,!1!

,#,

'1#.:(,1'1!,

 

!,'1,,,,,'1$,

(,1,,!,!)

(,1!.,,

-,,,#,.

,'1!1'1#(,1(,1:

,'1!O,

,,-

'1#,$-#'1$-

$

,!'1$(,1#'1$-е

,.:

,, ).-,#

(,1!_

'1!,$,'1#-

,'1!6'1#(,1(,1#

QНdwНQ_

х_

u

t:t_Q

$.

1,# ),

 

У

 

,'1#),,'1$,

,!,!em

,!(,1

),,!,'1,'1

$-

$ '1#.,,,,'1#

'1# '1,-,!,.,!

 

(,1,,!,!)П

 

.,!

,,,#,,

 

,'1!6'1#(,1(,1:

ГЛАВА 1 3 Методы 283

ИСПОЛ ЬЗОВАНИЕ КОММЕНТА Р И Е В

Чтение комментариев при опущенном программном коде должно способство­ вать пониманию намерений программиста. Если это не так, значит, вы плохо комментируете свои программы. И наоборот: если вы не можете, опустив большинство комментариев, понять, что делает программа, на основании имен методов, значит, вы недостаточно ясно именуете методы и/или делаете их слишком большими. Меньшие методы предпочтительнее, а хорошие имена методов предпочтительнее комментариев. (Вот почему реальный код имеет гораздо меньше комментариев, чем примеры кода в этой книге. В коде книги комментарии используются для более подробного объяснения.)

 

PВ ИЕРМИ!ВНoeСМР ВЗ В

ИН!ИЕТИИМKМБПСКВПeБoИАВ!ВП ПС ИeЗ!ИП

 

 

АИП СВ\ЕТИ!ЕР!МБ

НeК!ИЕТeБ.АВЗ eЕТeПСFSТSeИИСНМЗoИН ИИЗВЕТИИ

ТЕ

ЗАПОМНИ!

ИoСНВ\АВВЗКВН

АПИЕТИА НВЧНeooАm!·l ,0! ЧТЕХЧТЕХc fТЕХ, ПС!

eЕТK!МА\ЕТИ!ЕР! МoВЗНeКВop

 

 

 

 

 

)

I

 

З

Е

! I

\АВ СНМ НВЧНeoЕo

oИНБВНВТИeВ АВЕПМ!МАИB

oИАВ АВИe

!e \В

СНВИПАМНВПeИМKoИАВ!ВПТЕХ\\ЕТМПС

\АВМАМК\ЕТИ!ЕР!МБ АНИБ

e\АИЗp

МКЕ

МАИ

"1 , АЗАe-! " КВД!ТЕХРИОoОМА!И ААМОВИИИО! ЧМОТМИББ АМОВИИА! ИИ bИ

>>часть начального ввода данных, в которой пользователи вводят вклад, процентную ставку и срок;

»раздел, выводящий введенную информацию на экран, чтобы поль­ зователь мог убедиться в корректности ввода;

»последняя часть кода, создающая и выводящая таблицу на экран.

сa

a

i

»вклада,

»процентной ставки и

»срока

 

 

 

 

 

 

P

 

 

P

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

э

 

 

p. г

m

жdн.н жСч а

 

} P

о

}

Оt

.dT С. гжПaСнT pг

 

о

l -L l.» ­'l ­ i

О

 

 

 

 

e

SL

b

L

l

­

w ,

l

б

 

 

 

 

 

л

 

uu

 

 

 

 

 

 

 

 

 

 

uu

 

 

 

 

 

 

 

 

 

л

 

uu

 

э

 

 

 

 

 

 

 

 

 

uu

l

b

ЗK

l

l K

-

l.­ 'l ­ ­

i

 

K

GKKbl

 

 

 

­b

K

,

w

K

 

 

 

 

 

 

 

 

­b

K­b

­i'K

­ S

­

w. :

K wа

 

ИИ6 1

ilb­

K

­

b­­

K

б

ilb­

K

l

a

б

ilb­

K

i

K

­ a

б

В

З ll

Ka K с lr

­

Kb­

э

lr­

ll л

 

 

 

 

lri

K

­

бs

 

 

ИИ

 

P

1

а

Я

 

 

 

 

ИИ

".l

­

lщl­ S дб

uu

 

 

 

 

G

 

 

 

 

н t

G

б.

­l щl ­ l iн

b·­

K s б

 

 

G

б. l­

lщ­l i н

K

 

н t

ll

l

 

 

H

эl.

 

А

t

н eн sб

 

н t

­ щl ­ сl нG

K ­

t

н

 

s бн

 

 

 

i

 

 

ГЛАВА 1 3 Методы 285

=<=

=

Раздел иев з ссостоит из трех очевидных частей, каждая из которых снаб­ жена комментарием, выделенным полужирным шрифтом. Кроме того, раз­ дел 1 , в свою очередь, поделен на три подраздела - 1 а, 1 б и 1 в.

Вам не следует пытаться выделять в своих исходных текстах комментарии полужирным шрифтом или указывать номера разделов. Исходный текст ре­ альной программы - и без того сложная и запутанная штука, чтобы вносить в него искусственные усложнения. На практике для понимания достаточно яс­ ных и информативных имен методов, указывающих их назначение.

В разделе 1

для ввода значений трех переменных, необходимых для рабо­

ты программы

oпевыепи еврoнрннoим ры ди5лоi. вызывается метод 1в пыo

1в oнoннoNиoио бВКразделе 2 полученные значения выводятся на экран так же, как и в предыдущих версиях программы. В разделе 3 строится и выводится на экран таблица вкладов с помощью метода дыoптo:тд7а74oйийн7и б 1

ГЛАВА 1 3 Методы 287

OutputinterestTaЫe ( ) . А вем ко.есrаткз фатдy

ттотосомтеродвзеткзтеспкдевпевисакдеввеe рсофевтотйтосвотитйтит

трсоасиммеCalculateinterestTaЫe бечмето.отS'сеамраектто .иввоь тескаа читдтсиеткз т томйсто рса сичсиботтестоьсикта то.и ве врrво ко. ксе.отосатитнкзви .етидзe тто.и а теспnати-па .иввеeо 'са виракиваа стоаомето.и кде.рет рсокто.рмитн о томйтит тесакдатн а тетекта тибдай фр.дз рrе родрсеввеeчвисевпьо'окде теродвевазмето.и ррситдеваетес)

веткз т ктсотрhкде.ртарт чи течотом мето.и Output i nterestTaЬle ( ) . Output interestTaЬle ( ) - eосоипь рото. .дз тоаоhстобе токроднчотитнкз мевт сеnиттоспвiиRefactor т uэocСoЭщcRбоэ,дз схоаотеродватекде.ртаае

.еькттпзе

ы мВоспои nьзуйтесь в качестве стартовой точки примером Calculateinte­ restTaЬleМoreForgiving из гnавы 5, "Управnение потоком выпоnне­ ния' выбрав исходный текст от обьявnения переменной year до конца цикnа while:

д

--

р

е --

ннЭ, а й и

 

ееаВыберите команду меню Editc>Refactorr::>Extract Method.

иоаВ диаnоговом окне Rename: New Method введите Outputinterestтaыe.

Обратите внимание, что каждое местоположение в коде, где есть ссылка на новый метод, при вводе автоматически изменяется. Предложенная сигнатура нового метода начинается с ключевых слов private static и включает в себя principal, interest и duration в скобках. (В части 1 , "Основы программи­ рования на С#'; книги в качестве альтернативы ключевому слову puЫic вво­ дится private. Пока что, если захотите, вы сможете сделать метод открытым (puЫic) после рефакторинга.)

l

щ

n

щ

 

4. Щеnкните на кнопке Apply дnя завершения рефакторинга.

 

Выбранный вами в п. 1 код располагается после M ain ( ) и именуется OutputinterestTaЫe ( ) . На месте, где он находился ранее, вы увидите вы­ зов этого метода:

_

(

щ

(

n ;

288

4

-014- 10 80-- 4 0 00 88 10 80-14 -0

Могут применяться и другие виды рефакторинrа - например, изменение порядка параметров метода, но дальнейшее углубление в эту тему выходит за рамки данной книги.

Поскольку С# поддерживает именованные параметры, вы можете указывать параметры метода в любом порядке, предваряя значение

параметра его именем при вызове метода. Подробнее об этом вы уз­ охлюк наете немного позже, а пока просто знайте, что в С# 4.0 и более позд-

них версиях переупорядочение параметров проблемой не является.

В методе InputinterestData ( ) вы сосредоточиваетесь только на вводе трех значений типа decimal . В дан ном случае, несмотря на три различные пере­ менные, действия по их вводу идентич ны и могут быть размещены в методе InputPositiveDecimal ( ) , который одинаково применим как для ввода вклада, так и для ввода процентной ставки и срока, для которого выполняется расчет. Заметьте, что три цикла while в исходной программе превратились в один в теле метода I nputPosit iveDecimal ( ) . Тем самым устранено дублирование кода, которое всегда нежелательно.

Метод I nputPosit iveDecimal ( ) выводит приглашение и ожидает ввода пользователя . Если в веденное пользователем значение неотрицательно, он возвращает его вызвавшему его методу. Если же введенное значение отрица­ тельно, метод выводит сообщение об ошибке и повторяет цикл ввода. С точки зрения пользователя, программа работает точ но так же, как и раньше:

т UOO

т ,UO

у UO

Uт O

UOO

UOo

UO

U,UlO, O ­ ,r ­ U , OO ПVrПП) UO

а , Uа к ,а U

г,UкU, Oг к, Uлл, r кo

л , U па , нн н,­ U а, Пл

п,­Пг + нU

UO,­гп , Пп

, ) )

лхлвл Бr Методы чьби

ЗАЧ ЕМ БЕС П ОКОИТЬС Я О М ЕТОДАХ?

Когда в 1 950-е годы в Фортране появилась концепция функции, ее единствен­ ной целью было избежать дублирования кода. Предположим, вы пишете программу, которая должна вычислять отношение двух чисел во многих ме­ стах. В этом случае программа может просто вызывать в этих местах метод CalculateRatio ( ) , позволяющий избежать дублирования кода. Такая эко­ номия может показаться не слишком большой, если метод состоит всего из пары строк, но методы бывают разными; они могут быть очень сложными и большими. Кроме того, распространенные методы наподобие WriteLine ( ) могут использоваться в сотнях различных мест.

Второе преимущество применения методов также очевидно: проще коррек­ тно написать и отладить один метод, чем десяток фрагментов кода, и вдвойне проще сделать это, если метод невелик. Метод CalculateRatio ( ) включает проверку того, что знаменатель в отношении не равен нулю. Если у вас имеется множество фрагментов кода, а не один метод, то, скорее всего, в некоторых местах программы вы просто забудете вставить эту проверку.

Менее очевидно третье преимущество: хорошо спроектированные методы снижают сложность программы. Каждый метод должен соответствовать не­ которой концепции. Вы должны быть способны указать назначение каждого метода без использования слов u и или. Вы должны следовать принципу"один метод - одна задача':

Метод наподобие calculateSin ( ) служит идеальным примером. Програм­ мист, реализуя сложные вычисления, совершенно не должен беспокоиться, как именно будут применены их результаты. Прикладной программист может использовать метод calculateSin ( ) , не интересуясь, как именно он устроен и работает. Этот подход существенно снижает количество вещей, о которых должен помнить прикладной программист. Большую работу гораздо проще сделать, если разделить ее на части.

Большиепрограммы,как,например,текстовый редактор,строятся измножества методов разного уровня абстракции. Например, метод RedisplayDocument ( ) должен вызывать метод Reparagraph ( ) для вывода абзацев документа. Этот метод, в свою очередь, должен вызывать метод CalculateWordWrap ( ) для вы­ числения длин отдельных строк абзаца. Метод CalculateWordWrap ( ) может вызывать метод LookUpWordBreak ( ) , определяющий, какдолжно быть разби­ тодля переноса слово, стоящее в концестроки. Каждый из перечисленных ме­ тодов решает одну задачу, которую можно сформулировать простым предло­ жением (кстати, обратите внимание и на информативность названий методов).

Без возможности абстрагирования сложных концепций написание програм­ мы даже средней сложности становится практически нереализуемым, не го­ воря уже о создании операционных систем, игр, офисного программного обе­ спечения и тому подобных больших и сложных программ.

290 ЧАСТЬ 2 Объектно-ориентированное программирование на С#

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