Professional Documents
Culture Documents
Giao Trinh C#
Giao Trinh C#
Ngn Ng Lp Trnh C#
Mc Lc
1. Microsoft .NET............................................................................................... 10
Tnh hnh trc khi MS.NET ra i........................................................ 10
Ngun gc ca .NET................................................................................12
Microsoft .NET........................................................................................ 12
Tng quan................................................................................................ 12 Kin trc .NET Framework..................................................................... 13 Common Language Runtime................................................................... 15 Th vin .NET Framework...................................................................... 16 Pht trin ng dng client........................................................................ 16
2. Ngn ng C#.................................................................................................... 20
Ti sao phi s dng ngn ng C#...........................................................20
C# l ngn ng n gin.......................................................................... 20 C# l ngn ng hin i........................................................................... 21 C# l ngn ng hng i tng............................................................. 21 C# l ngn ng mnh m......................................................................... 22 C# l ngn ng t t kha.........................................................................22 C# l ngn ng module ha..................................................................... 22 C# s l ngn ng ph bin......................................................................22
Ngn ng C# vi ngn ng khc............................................................. 23 Cc bc chun b cho chng trnh....................................................... 24 Chng trnh C# n gin....................................................................... 25 Pht trin chng trnh minh ha.............................................................31 Cu hi & bi tp..................................................................................... 35
Bin v hng............................................................................................ 44
Gn gi tr xc nh cho bin................................................................... 45 Hng......................................................................................................... 46 2
Ngn Ng Lp Trnh C#
Ngn Ng Lp Trnh C#
4. Xy dng lp - i tng............................................................................87
nh ngha lp......................................................................................... 88
Thuc tnh truy cp.................................................................................. 91 Tham s ca phng thc........................................................................ 92
To i tng........................................................................................... 93
B khi dng............................................................................................93 Khi to bin thnh vin.......................................................................... 96 B khi dng sao chp.............................................................................98 T kha this............................................................................................. 99
Hy i tng.......................................................................................... 104 Truyn tham s.........................................................................................107 Np chng phng thc........................................................................... 112 ng gi d liu vi thuc tnh............................................................... 116 Thuc tnh ch c................................................................................... 119 Cu hi & bi tp..................................................................................... 121
Ngn Ng Lp Trnh C#
a hnh..................................................................................................... 133
Kiu a hnh............................................................................................. 133 Phng thc a hnh................................................................................ 133 T kha new v override......................................................................... 137
7. Cu trc............................................................................................................. 165
nh ngha mt cu trc........................................................................... 165 To cu trc..............................................................................................168
Cu trc l mt kiu gi tr...................................................................... 168 Gi b khi dng mc nh..................................................................... 169 To cu trc khng gi new..................................................................... 170
Thc thi ph quyt giao din................................................................... 193 Thc thi giao din tng minh.................................................................197
5
Ngn Ng Lp Trnh C#
B ch mc............................................................................................... 232
B ch mc v php gn........................................................................... 236 S dng kiu ch s khc......................................................................... 237
Giao din tp hp..................................................................................... 241 Giao din IEnumerable...................................................................... 242 Giao din ICollection......................................................................... 246 Danh sch mng....................................................................................... 247 Thc thi IComparable........................................................................ 251 Thc thi IComparer........................................................................... 254 Hng i...................................................................................................259 Ngn xp.................................................................................................. 262 Kiu t in..............................................................................................265 Hastables.......................................................................................... 266 Giao din IDictionary.........................................................................267 Tp kha v tp gi tr.....................................................................269 Giao din IDictionaryEnumerator....................................................... 270 Cu hi & bi tp..................................................................................... 271
Ngn Ng Lp Trnh C#
S kin..................................................................................................... 324
C ch publishing- subscribing................................................................324 S kin v y quyn................................................................................. 325
12. Cc lp c s .NET......................................................................................335
Lp i tng trong .NET Framework.................................................... 335 Lp Timer................................................................................................ 337 Lp v th mc v h thng.................................................................... 340 Lp Math..................................................................................................342 Lp thao tc tp tin.................................................................................. 345 Lm vic vi tp tin d liu..................................................................... 351 Cu hi & bi tp..................................................................................... 362
Nhng i tng ngoi l........................................................................ 375 To ring cc ngoi l.............................................................................. 378 Pht sinh li ngoi l................................................................................ 381 Cu hi & bi tp..................................................................................... 385
Ngn Ng Lp Trnh C#
Tham Kho
Gio trnh Ngn ng Lp trnh C# c bin dch v tng hp t: Programming C#, Jesse Liberty, OReilly. C# in 21 Days, Bradley L.Jones, SAMS. Windows Forms Programming with C#, Erik Brown, Manning. MSDN Library April 2002.
Quy c
Gio trnh s dng mt s quy c nh sau: Cc thut ng c gii thiu ln u tin s in nghing. M ngun ca chng trnh minh ha dng font Verdana10. Cc t kha ca C# dng font Verdana10,mhoc Verdana10,bnhthng. Tn namspace, lp, i tng, phng thc, thuc tnh, s kin... dng font Verdana
10.
Ngn Ng Lp Trnh C#
Chng 1
MICROSOFT .NET
Tnh hnh trc khi MS.NET ra i
Ngun gc ca .NET
Microsoft .NET
Tng quan Kin trc .NET Framework Common Language Runtime (CLR) Th vin .NET Framework Pht trin ng dng client
cc cng c c xy dng cho Perl tuy rt mnh nhng do nhiu nhm pht trin v ngi ta khng m bo rng tng lai ca n ngy cng tt p hn.
Ngn Ng Lp Trnh C#
10
Microsoft .NET
Ngn Ng Lp Trnh C#
Trong gii pht trin ng dng trn Windows ta c th vit ng dng bng Visual C++, Delphi hay Visual Basic, y l mt s cng c ph bin v mnh. Trong Visual C++ l mt ngn ng rt mnh v cng rt kh s dng. Visual Basic th n gin d hc, d dng nht nn rt thng dng. L do chnh l Visual Basic gip chng ta c th vit chng trnh trn Windows d dng m khng cn thit phi bit nhiu v cch thc MS Windows hot ng, ta ch cn bit mt s kin thc cn bn ti thiu v MS Windows l c th lp trnh c. Do theo quan im ca Visual Basic nn n lin kt vi Windows l iu t nhin v d hiu, nhng hn ch l Visual Basic khng phi ngn ng hng i tng (Object Oriented). Delphi l hu du ca Turbo Pascal ca Borland. N cng ging v tng i d dng nh Visual Basic. Delphi l mt ngn ng hng i tng. Cc iu khin dng trn Form ca Delphi u c t ng khi to m ngun. Tuy nhin, chc nng khi ng m ngun ny ca Delphi i khi gp rc ri khi c s can thip ca ngi dng vo. Sau ny khi cng ty Borland b bn v cc chuyn gia xy dng nn Delphi chy qua bn Microsoft, v Delphi khng cn c pht trin tt na, ngi ta khng dm u t trin khai phn mm vo Delphi. Cng ty sau ny pht trin dng sn phm Jbuilder (dng Java) khng cn quan tm n Delphi. Tuy Visual Basic bn hn do khng cn phi khi to m ngun trong Form khi thit k nhng Visual Basic cng c nhiu khuyt im : Khng h tr thit k hng i tng, nht l kh nng tha k (inheritance). Gii hn v vic chy nhiu tiu trnh trong mt ng dng, v d ta khng th dng Visual Basic vit mt Service kiu NT. Kh nng x l li rt yu, khng thch hp trong mi trng Multi- tier Kh dng chung vi ngn ng khc nh C++. Khng c User Interface thch hp cho Internet. Do Visual Basic khng thch hp cho vit cc ng Web Server nn Microsoft to ra ASP (Active Server Page). Cc trang ASP ny va c tag HTML va cha cc on script (VBScript, JavaScript) nm ln ln nhau. Khi x l mt trang ASP, nu l tag HTML th s c gi thng qua Browser, cn cc script th s c chuyn thnh cc dng HTML ri gi i, ngoi tr cc function hay cc sub trong ASP th v tr cc script khc rt quan trng. Khi mt s chc nng no c vit tt ngi ta dch thnh ActiveX v a n vo Web Server. Tuy nhin v l do bo mt nn cc ISP (Internet Service Provider) lm my ch cho Web site thng rt d t khi ci ActiveX l trn my ca h. Ngoi ra vic tho g cc phin bn ca ActiveX ny l cng vic rt kh, thng xuyn lm cho 11
Microsoft .NET
Ngn Ng Lp Trnh C#
Administrator nhc u. Nhng ngi tng qun l cc version ca DLL trn Windows iu than phin ti sao phi ng k cc DLL v nht l ch c th ng k mt phin bn ca DLL m thi. V t DLL Hell xut hin tc l a ngc DLL
12
Microsoft .NET
Ngn Ng Lp Trnh C#
Sau ny gip cho vic lp trnh ASP nhanh hn th cng c Visual InterDev, mt IDE (Integrated Development Environment) ra i. Visual InterDev to ra cc Design Time Controls cho vic thit k cc iu khin trn web, Tic thay Visual InterDev khng bn vng lm nn sau mt thi gian th cc nh pht trin ri b n. Tm li bn thn ca ASP hy cn mt s khuyt im quan trng, nht l khi chy trn Internet Information Server vi Windows NT 4, ASP khng ng tin cy lm. Tm li trong gii lp trnh theo Microsoft th vic lp trnh trn desktop cho n lp trnh h phn tn hay trn web l khng c nhp nhng cho lm. chuyn c t lp trnh client hay desktopn lp trnh web l mt chng ng di.
Ngun gc .NET
u nm 1998, sau khi hon tt phin bn Version 4 ca Internet Information Server (IIS), cc i ng lp trnh Microsoft nhn thy h cn rt nhiu sng kin kin ton IIS. H bt u xy dng mt kin trc mi trn nn tng tng v t tn l Next Generation Windows Services (NGWS). Sau khi Visual Basic c trnh lng vo cui 1998, d n k tip mang tn Visual Studio 7 c xc nhp vo NGWS. i ng COM+/MTS gp vo mt universal runtime cho tt c ngn ng lp trnh chung trong Visual Studio, v tham vng ca h cung cp cho cc ngn ng lp trnh ca cc cng ty khc dng chung lun. Cng vic ny c xc tin mt cch hon ton b mt mi cho n hi ngh Professional Developers Conference Orlado vo thng 7/2000. n thng 11/2000 th Microsoft pht hnh bn Beta 1 ca .NET gm 3 a CD. Tnh n lc ny th Microsoft lm vic vi .NET gn 3 nm ri, do bn Beta 1 ny tng i vng chc. .NET mang dng dp ca nhng sng kin c p dng trc y nh p-code trong UCSD Pascal cho n Java Virtual Machine. C iu l Microsoft gp nht nhng sng kin ca ngi khc, kt hp vi sng kin ca chnh mnh lm nn mt sn phm hon chnh t bn trong ln bn ngoi. Hin ti Microsoft cng b phin bn release ca .NET. Tht s Microsoft t cc vo .NET v theo thng tin ca cng ty, tp trung 80% sc mnh ca Microsoft nghin cu v trin khai .NET (bao gm nhn lc v ti chnh ?), tt c cc sn phm ca Microsoft s c chuyn qua .NET.
Microsoft .NET
Tng quan
Microsoft .NET gm 2 phn chnh : Framework v Integrated Development Environment (IDE). Framework cung cp nhng g cn thit v cn bn, ch Framework 13
Microsoft .NET
Ngn Ng Lp Trnh C#
c ngha l khung hay khung cnh trong ta dng nhng h tng c s theo mt qui c nht nh cng vic c tri chy. IDE th cung cp mt mi trng gip chng ta trin khai d dng, v nhanh chng cc ng dng da trn nn tng .NET. Nu khng c IDE chng ta cng c th
14
Microsoft .NET
Ngn Ng Lp Trnh C#
dng mt trnh son tho v nh Notepad hay bt c trnh son tho vn bn no v s dng command line bin dch v thc thi, tuy nhin vic ny mt nhiu thi gian. Tt nht l chng ta dng IDE pht trin cc ng dng, v cng l cch d s dng nht. Thnh phn Framework l quan trng nht .NET l ct li v tinh hoa ca mi trng, cn IDE ch l cng c pht trin da trn nn tng thi. Trong .NET ton b cc ngn ng C#, Visual C++ hay Visual Basic.NET u dng cng mt IDE. Tm li Microsoft .NET l nn tng cho vic xy dng v thc thi cc ng dng phn tn th h k tip. Bao gm cc ng dng t client n server v cc dch v khc. Mt s tnh nng ca Microsoft .NET cho php nhng nh pht trin s dng nh sau: Mt m hnh lp trnh cho php nh pht trin xy dng cc ng dng dch v web v ng dng client vi Extensible Markup Language (XML). Tp hp dch v XML Web, nh Microsoft .NET My Services cho php nh pht trin n gin v tch hp ngi dng kinh nghim. Cung cp cc server phc v bao gm: Windows 2000, SQL Server, v BizTalk Server, tt c iu tch hp, hot ng, v qun l cc dch v XML Web v cc ng dng. Cc phn mm client nh Windows XP v Windows CE gip ngi pht trin phn phi su v thuyt phc ngi dng kinh nghim thng qua cc dng thit b. Nhiu cng c h tr nh Visual Studio .NET, pht trin cc dch v Web XML, ng dng trn nn Windows hay nn web mt cch d dng v hiu qu.
Ngn Ng Lp Trnh C#
xy dng tt c cc thng tin da trin tiu chun cng nghip m bo rng m ngun trn .NET c th tch hp vi bt c m ngun khc. .NET Framework c hai thnh phn chnh: Common Language Runtime (CLR) v th vin lp .NET Framework. CLR l nn tng ca .NET Framework. Chng ta c th hiu runtime nh l mt agent qun l m ngun khi n c thc thi, cung cp cc dch v ct li nh: qun l b nh, qun l tiu trnh, v qun l t xa. Ngoi ra n cn thc y vic s dng kiu an ton v cc hnh thc khc ca vic chnh xc m ngun, m bo cho vic thc hin c bo mt v mnh m. Tht vy, khi nim qun l m ngun l nguyn l nn tng ca runtime. M ngun m ch ti runtime th c bit nh l m ngun c qun l (managed code). Trong khi m ngun m khng c ch ti runtime th c bit nh m ngun khng c qun l (unmanaged code). Th vin lp, mt thnh phn chnh khc ca .NET Framework l mt tp hp hng i tng ca cc kiu d liu c dng li, n cho php chng ta c th pht trin nhng ng dng t nhng ng dng truyn thng command-line hay nhng ng dng c giao din ha (GUI) n nhng ng dng mi nht c cung cp bi ASP.NET, nh l Web Form v dch v XML Web.
16
Microsoft .NET
Ngn Ng Lp Trnh C#
17
Microsoft .NET
qun l b nh xa b nhng phn mnh b nh nu c th c v gia tng tham chiu b nh cc b, v kt qu gia tng hiu qu thc thi.
trang web trn Internet. Cc ng dng ny cng ging nh nhng ng dng client khc l c th truy cp ti nguyn cc b. Trong qu kh, nhng nh pht trin c th to cc ng dng s dng C/C++ thng qua kt ni vi MFC hoc s dng mi trng pht trin ng dng nhanh (RAD: Rapid
Application Development). .NET Framework tch hp din mo ca nhng sn phm thnh mt. Mi trng pht trin c nh lm n gin mnh m s pht trin ca ng dng client. Nhng lp .NET Framework cha trong .NET Framework c thit k cho vic s dng pht trin cc GUI. iu ny cho php ngi pht trin nhanh chng v d dng to cc ca s, button, menu, toolbar, v cc thnh phn khc trong cc ng dng c vit phc v cho lnh vc thng mi. V d nh, .NET cung cp nhng thuc tnh n gin hiu chnh cc hiu ng visual lin quan n form. Trong vi trng hp h iu hnh khng h tr vic thay i nhng thuc tnh ny mt cch trc tip, v trong trng hp ny .NET t ng to li form. y l mt trong nhiu cch m .NET tch hp vic pht trin giao din lm cho m ngun n gin v mnh m hn. Khng ging nh ActiveX control, Windows Form control c s truy cp gii hn n my ca ngi s dng. iu ny c ngha rng m ngun thc thi nh phn c th truy cp mt vi ti nguyn trong my ca ngi s dng (nh cc thnh phn ha hay mt s tp tin c gii hn) m khng th truy cp n nhng ti nguyn khc. Nguyn nhn l s bo mt truy cp ca m ngun. Lc ny cc ng dng c ci t trn my ngi dng c th an ton a ln Internet
th c dng li. Do tt c cc ngn ng .NET Framework cng to ra sn phm MSIL ging nhau, nn kt qu l mt i tng c to ra t ngn ng ny c th c truy cp hay c dn xut t
mt i tng ca ngn ng khc trong .NET. V d, ngi pht trin c th to mt lp c s trong VB.NET v sau dn xut n trong C# mt cch d dng.
Ngn ng C#
Ngn ng C# kh n gin, ch khong 80 t kha v hn mi my kiu d liu c xy dng sn. Tuy nhin, ngn ng C# c ngha cao khi n thc thi nhng khi nim lp trnh hin i. C# bao gm tt c nhng h tr cho cu trc, thnh phn component, lp trnh hng i tng. Nhng tnh cht hin din trong mt ngn ng lp trnh hin i. V ngn ng C# hi nhng iu kin nh vy, hn na n c xy dng trn nn tng ca hai ngn ng mnh nht l C++ v Java. Ngn ng C# c pht trin bi i ng k s ca Microsoft, trong ngi dn u l Anders Hejlsberg v Scott Wiltamuth. C hai ngi ny iu l nhng ngi ni ting, trong Anders Hejlsberg c bit n l tc gi ca Turbo Pascal, mt ngn ng lp trnh PC ph bin. V ng ng u nhm thit k Borland Delphi, mt trong nhng thnh cng u tin ca vic xy dng mi trng pht trin tch hp (IDE) cho lp trnh client/server. Phn ct li hay cn gi l tri tim ca bt c ngn ng lp trnh hng i tng l s h tr ca n cho vic nh ngha v lm vic vi nhng lp. Nhng lp th nh ngha nhng kiu d liu mi, cho php ngi pht trin m rng ngn ng to m hnh tt hn gii quyt vn . Ngn ng C# cha nhng t kha cho vic khai bo nhng kiu lp i tng mi v nhng phng thc hay thuc tnh ca lp, v cho vic thc thi ng gi, k tha, v a hnh, ba thuc tnh c bn ca bt c ngn ng lp trnh hng i tng. Trong ngn ng C# mi th lin quan n khai bo lp iu c tm thy trong phn khai bo ca n. nh ngha mt lp trong ngn ng C# khng i hi phi chia ra tp tin header v tp tin ngun ging nh trong ngn ng C++. Hn th na, ngn ng C# h tr kiu XML, cho php chn cc tag XML pht sinh t ng cc document cho lp. C# cng h tr giao din interface, n c xem nh mt cam kt vi mt lp cho nhng dch v m giao din quy nh. Trong ngn ng C#, mt lp ch c th k tha t duy nht mt lp cha, tc l khng cho a k tha nh trong ngn ng C++, tuy nhin mt lp c th thc thi nhiu giao din. Khi mt lp thc thi mt giao din th n s ha l n s cung cp chc nng thc thi giao din. Trong ngn ng C#, nhng cu trc cng c h tr, nhng khi nim v ng ngha ca n thay i khc vi C++. Trong C#, mt cu trc c gii hn, l kiu d liu nh gn,
v khi to th hin th n yu cu t hn v h iu hnh v b nh so vi mt lp. Mt cu trc th khng th k tha t mt lp hay c k tha nhng mt cu trc c th thc thi mt giao din. Ngn ng C# cung cp nhng c tnh hng thnh phn (component-oriented), nh l nhng thuc tnh, nhng s kin. Lp trnh hng thnh phn c h tr bi CLR cho php lu tr metadata vi m ngun cho mt lp. Metadata m t cho mt lp, bao gm nhng
phng thc v nhng thuc tnh ca n, cng nh nhng s bo mt cn thit v nhng thuc tnh khc. M ngun cha ng nhng logic cn thit thc hin nhng chc nng ca n.. Do vy, mt lp c bin dch nh l mt khi self-contained, nn mi trng hosting bit c cch c metadata ca mt lp v m ngun cn thit m khng cn nhng thng tin khc s dng n. Mt lu cui cng v ngn ng C# l ngn ng ny cng h tr vic truy cp b nh trc tip s dng kiu con tr ca C++ v t kha cho du ngoc [] trong ton t. Cc m ngun ny l khng an ton (unsafe). V b gii phng b nh t ng ca CLR s khng thc hin vic gii phng nhng i tng c tham chiu bng s dng con tr cho n khi chng c gii phng.
Chng 2
NGN NG C#
Ti sao phi s dng ngn ng C#
C# l ngn ng n gin C# l ngn ng hin i C# l ngn ng hng i tng C# l ngn ng mnh m C# l ngn ng t t kha C# l ngn ng module ha C# s l ngn ng ph bin
Ngn ng C# v nhng ngn ng khc Cc bc chun b cho chng trnh Chng trnh C# n gin Pht trin chng trnh minh ha Cu hi & bi tp
C# l ngn ng mnh m v mm do
28
Ngn Ng C#
C# l ngn ng n gin
C# loi b mt vi s phc tp v ri rm ca nhng ngn ng nh Java v c++, bao gm vic loi b nhng macro, nhng template, a k tha, v lp c s o (virtual base class). Chng l nhng nguyn nhn gy ra s nhm ln hay dn n nhng vn cho cc ngi pht trin C++. Nu chng ta l ngi hc ngn ng ny u tin th chc chn l ta s khng tri qua nhng thi gian hc n! Nhng khi ta s khng bit c hiu qu ca ngn ng C# khi loi b nhng vn trn. Ngn ng C# n gin v n da trn nn tng C v C++. Nu chng ta thn thin vi C v C++ hoc thm ch l Java, chng ta s thy C# kh ging v din mo, c php, biu thc, ton t v nhng chc nng khc c ly trc tip t ngn ng C v C++, nhng n c ci tin lm cho ngn ng n gin hn. Mt vi trong cc s ci tin l loi b cc d tha, hay l thm vo nhng c php thay i. V d nh, trong C++ c ba ton t lm vic vi cc thnh vin l ::, . , v ->. bit khi no dng ba ton t ny cng phc tp v d nhm ln. Trong C#, chng c thay th vi mt ton t duy nht gi l . (dot). i vi ngi mi hc th iu ny v nhng vic ci tin khc lm bt nhm ln v n gin hn. Ghi ch: Nu chng ta s dng Java v tin rng n n gin, th chng ta cng s tm thy rng C# cng n gin. Hu ht mi ngi u khng tin rng Java l ngn ng n gin. Tuy nhin, C# th d hn l Java v C++.
C# l ngn ng hin i
iu g lm cho mt ngn ng hin i? Nhng c tnh nh l x l ngoi l, thu gom b nh t ng, nhng kiu d liu m rng, v bo mt m ngun l nhng c tnh c mong i trong mt ngn ng hin i. C# cha tt c nhng c tnh trn. Nu l ngi mi hc lp trnh c th chng ta s cm thy nhng c tnh trn phc tp v kh hiu. Tuy nhin, cng ng lo lng chng ta s dn dn c tm hiu nhng c tnh qua cc chng trong cun sch ny. Ghi ch: Con tr c tch hp vo ngn ng C++. Chng cng l nguyn nhn gy ra nhng rc ri ca ngn ng ny. C# loi b nhng phc tp v rc ri pht sinh bi con tr. Trong C#, b thu gom b nh t ng v kiu d liu an ton c tch hp vo ngn ng, s loi b nhng vn rc ri ca C++. 29
Ngn Ng C#
30
Ngn Ng C#
c nhng c tnh trn. Phn hng i tng ca C# s c trnh by chi tit trong mt chng ring phn sau.
C# l ngn ng t t kha
C# l ngn ng s dng gii hn nhng t kha. Phn ln cc t kha c s dng m t thng tin. Chng ta c th ngh rng mt ngn ng c nhiu t kha th s mnh hn. iu ny khng phi s tht, t nht l trong trng hp ngn ng C#, chng ta c th tm thy rng ngn ng ny c th c s dng lm bt c nhim v no. Bng sau lit k cc t kha ca ngn ng C#.
abstract as base bool break byte case catch char checked class const continue decimal e ut dfa l e delgate do ue dob l e es l enum ven e t xl epici t xter e n s fale a finly l xd fi e at flo for rech fo a t goo if pi im ct i l in int terface in ternal in is c lo k long e a namspce ew n u nl l bjct o e erator op t ou verride o a m pra s rivate p ote ed pr ct li pub c aonly red f re t n reu r bt sye e saled short ef siz o cal c sta o k l tc stai string u str t c wth s c i s th i w th o r u tr e y tr eo ty f p nt u i o u n l g n e u cked ch n a u fe s s or u t h sg un i a virtu l tie vola l void hle w i
thng tin n nhng lp hay phng thc chng ta c th to ra nhng m ngun dng li c hiu qu.
C# s l mt ngn ng ph bin
32
Ngn Ng C#
C# l mt trong nhng ngn ng lp trnh mi nht. Vo thi im cun sch ny c vit, n khng c bit nh l mt ngn ng ph bin. Nhng ngn ng ny c mt s l do tr thnh mt ngn ng ph bin. Mt trong nhng l do chnh l Microsoft v s cam kt ca .NET Microsoft mun ngn ng C# tr nn ph bin. Mc d mt cng ty khng th lm mt sn phm tr nn ph bin, nhng n c th h tr. Cch y khng lu, Microsoft gp s tht bi v h iu hnh Microsoft Bob. Mc d Microsoft mun Bob tr nn ph bin nhng tht bi. C# thay th tt hn em n thnh cng s vi Bob. Tht s l khng bit khi no mi ngi trong cng ty Microsoft s dng Bob trong cng vic hng ngy ca h. Tuy nhn, vi C# th khc, n c s dng bi Microsoft. Nhiu sn phm ca cng ty ny chuyn i v vit li bng C#. Bng cch s dng ngn ng ny Microsoft xc nhn kh nng c a C# cn thit cho nhng ngi lp trnh. Micorosoft .NET l mt l do khc em n s thnh cng ca C#. .NET l mt s thay i trong cch to v thc thi nhng ng dng. Ngoi hai l do trn ngn ng C# cng s tr nn ph bin do nhng c tnh ca ngn ng ny c cp trong mc trc nh: n gin, hng i tng, mnh m...
iu ny nn vic s dng con tr trong C# t quan trng hn trong C++. Nhng con tr cng c th c s dng trong C#, khi nhng on m ngun ny s c nh du l khng an ton (unsafe code).
34
Ngn Ng C#
C# cng t b tng a k tha nh trong C++. V s khc nhau khc l C# a thm thuc tnh vo trong mt lp ging nh trong Visual Basic. V nhng thnh vin ca lp c gi duy nht bng ton t . khc vi C++ c nhiu cch gi trong cc tnh hung khc nhau. Mt ngn ng khc rt mnh v ph bin l Java, ging nh C++ v C# c pht trin da trn C. Nu chng ta quyt nh s hc Java sau ny, chng ta s tm c nhiu ci m hc t C# c th c p dng. im ging nhau C# v Java l c hai cng bin dch ra m trung gian: C# bin dch ra MSIL cn Java bin dch ra bytecode. Sau chng c thc hin bng cch thng dch hoc bin dch just-in-time trong tng my o tng ng. Tuy nhin, trong ngn ng C# nhiu h tr c a ra bin dch m ngn ng trung gian sang m my. C# cha nhiu kiu d liu c bn hn Java v cng cho php nhiu s m rng vi kiu d liu gi tr. V d, ngn ng C# h tr kiu lit k (enumerator), kiu ny c gii hn n mt tp hng c nh ngha trc, v kiu d liu cu trc y l kiu d liu gi tr do ngi dng nh ngha. Chng ta s c tm hiu k hn v kiu d liu tham chiu v kiu d liu gi tr s c trnh by trong phn sau Tng t nh Java, C# cng t b tnh a k tha trong mt lp, tuy nhin m hnh k tha n ny c m rng bi tnh a k tha nhiu giao din.
V d mc tiu vit chng trnh x l vn bn n gin, mc tiu chnh l xy dng chng trnh cho php son tho v lu tr nhng chui k t hay vn bn. Nu khng c mc tiu th khng th vit c chng trnh hiu qu. Bc th hai l quyt nh n phng php vit chng trnh. Bc ny xc nh nhng thng tin no cn thit c s dng trong chng trnh, cc hnh thc no c s dng. T nhng thng tin ny chng ta rt ra c phng php gii quyt vn . Bc th ba l bc ci t, bc ny c th dng cc ngn ng khc nhau ci t, tuy nhin, ngn ng ph hp gii quyt vn mt cch tt nht s c chn. Trong phm vi ca sch ny chng ta mc nh l dng C#, n gin l chng ta ang tm hiu n! V bc cui cng l phn thc thi chng trnh xem kt qu.
----------------------------------------------------------------------------Kt qu:
Chao Mung
----------------------------------------------------------------------------Sau khi vit xong chng ta lu di dng tp tin c phn m rng *.cs (C sharp). Sau bin dch v chy chng trnh. Kt qu l mt chui Chao Mung s xut hin trong mn hnh console. Cc mc sau s gii thiu xoay quanh v d 2.1, cn phn chi tit tng loi s c trnh by trong cc chng k tip.
c xem nh tru tng. N c th l mt bng d liu, mt tiu trnh, hay mt nt lnh trong mt ca s. Tm li kiu c nh ngha nh mt dng va c thuc tnh chung (properties) v cc hnh vi ng x (behavior) ca n.
37
Ngn Ng C#
Nu trong mt ng dng trn Windows chng ta to ra ba nt lnh OK, Cancel, Help, th thc cht l chng ta ang dng ba th hin ca mt kiu nt lnh trong Windows v cc nt ny cng chia x cc thuc tnh v hnh vi chung vi nhau. V d, cc nt c cc thuc tnh nh kch thc, v tr, nhn tn (label), tuy nhin mi thuc tnh ca mt th hin khng nht thit phi ging nhau, v thng th chng khc nhau, nh nt OKc nhn l OK, Cancel c nhn l Cancel...Ngoi ra cc nt ny c cc hnh vi ng x chung nh kh nng v, kch hot, p ng cc thng ip nhn,Ty theo tng chc nng c bit ring ca tng loi th ni dung ng x khc nhau, nhng tt c chng c xem nh l cng mt kiu. Cng nh nhiu ngn ng lp trnh hng i tng khc, kiu trong C# c nh ngha l mt lp (class), v cc th hin ring ca tng lp c gi l i tng (object). Trong cc chng k tip s trnh by cc kiu khc nhau ngoi kiu lp nh kiu lit k, cu trc v kiu y quyn (delegates). Quay li chng trnh ChaoMungtrn, chng trnh ny ch c mt kiu n gin l lp
ChaoMung.
nh ngha mt kiu lp trong C# chng ta phi dng t kho class, tip sau l
tn lp trong v d trn tn lp l ChaoMung. Sau nh ngha cc thuc tnh v hnh ng cho lp. Thuc tnh v hnh ng phi nm trong du {}. Ghi ch: Khai bo lp trong C# khng c du ;sau ngoc }cui cng ca lp. V khc vi lp trong C/C++ l chia thnh 2 phn header v phn nh ngha. Trong C# , nh ngha mt lp c gi gn trong du {}sau tn lp v trong cng mt tp tin.
Phng thc
Hai thnh phn chnh cu thnh mt lp l thuc tnh hay tnh cht v phng thc hay cn gi l hnh ng ng x ca i tng. Trong C# hnh vi c nh ngha nh mt phng thc thnh vin ca lp. Phng thc chnh l cc hm c nh ngha trong lp. Do , ta cn c th gi cc phng thc thnh vin l cc hm thnh vin trong mt lp. Cc phng thc ny ch ra rng cc hnh ng m lp c th lm c cng vi cch thc lm hnh ng . Thng thng, tn ca phng thc thng c t theo tn hnh ng, v d nh
DrawLine()hay GetString().
Tuy nhin trong v d 2.1 va trnh by, chng ta c hm thnh vin l Main()hm ny l hm c bit, khng m t hnh ng no ca lp ht, n c xc nh l hm u vo c a lp (entry point) v c CRL gi u tin khi thc thi. Ghi ch: Trong C#, hm Main()c vit k t hoa u, v c th tr v gi tr voidhay
int
Khi chng trnh thc thi, CLR gi hm Main() u tin, hm Main() l u vo ca chng trnh, v mi chng trnh phi c mt hm Main(). i khi chng trnh c 38
Ngn Ng C#
nhiu hm Main() nhng lc ny ta phi xc nh cc ch dn bin dch CLR bit u l hm Main()u vo duy nht trong chng trnh.
39
Ngn Ng C#
Vic khai bo phng thc c xem nh l mt s giao c gia ngi to ra lp v ngi s dng lp ny. Ngi xy dng cc lp cng c th l ngi dng lp , nhng khng hon ton nh vy. V c th cc lp ny c xy dng thnh cc th vin chun v cung cp cho cc nhm pht trin khcDo vy vic tun th theo cc qui tc l rt cn thit. khai bo mt phng thc, phi xc nh kiu gi tr tr v, tn ca phng thc, v cui cng l cc tham s cn thit cho phng thc thc hin.
Ch thch
Mt chng trnh c vit tt th cn phi c ch thch cc on m c vit. Cc on ch thch ny s khng c bin dch v cng khng tham gia vo chng trnh. Mc ch chnh l lm cho on m ngun r rng v d hiu. Trong v d 2.1 c mt dng ch thch :
//Xuatramanhinh.
Mt chui ch thch trn mt dng th bt u bng k t //. Khi trnh bin dch gp hai k t ny th s b qua dng . Ngoi ra C# cn cho php kiu ch thch cho mt hay nhiu dng, v ta phi khai bo /* phn u ch thch v kt thc ch thch l k t */. V d 2.2 : Minh ha dng ch thch trn nhiu dng. ----------------------------------------------------------------------------classChaoMung { staticvoidMain() { /*Xuatramanhinhchuoichaomung SudunghamWriteLinecualopSystem.Console */ System.Console.WriteLine(ChaoMung); } }
----------------------------------------------------------------------------Kt qu:
Chao Mung
----------------------------------------------------------------------------Ngoi hai kiu ch thch trn ging trong C/C++ th C# cn h tr thm kiu th ba cng l kiu cui cng, kiu ny cha cc nh dng XML nhm xut ra tp tin XML khi bin dch to su liu cho m ngun. Chng ta s bn kiu ny trong cc chng trnh cc phn 40
Ngn Ng C#
tip.
41
Ngn Ng C#
ng dng Console
V d n gin trn c gi l ng dng console, ng dng ny giao tip vi ngi dng thng quan bn phm v khng c giao din ngi dng (UI), ging nh cc ng dng thng thy trong Windows. Trong cc chng xy dng cc ng dng nng cao trn Windows hay Web th ta mi dng cc cc giao din ha. Cn tm hiu v ngn ng C# thun tu th cch tt nht l ta vit cc ng dng console. Trong hai ng dng n gin trn ta dng phng thc WriteLine()ca lp Console. Phng thc ny s xut ra mn hnh dng lnh hay mn hnh DOS chui tham s a vo, c th l chui Chao Mung.
Namespace
Nh chng ta bit .NET cung cp mt th vin cc lp s v th vin ny c tn l FCL (Framework Class Library). Trong Console ch l mt lp nh trong hng ngn lp trong th vin. Mi lp c mt tn ring, v vy FCL c hng ngn tn nh ArrayList, Dictionary, FileSelector, iu ny lm ny sinh vn , ngi lp trnh khng th no nh ht c tn ca cc lp trong .NET Framework. T hn na l sau ny c th ta to li mt lp trng vi lp c chng hn. V d trong qu trnh pht trin mt ng dng ta cn xy dng mt lp t in v ly tn l Dictionary, v iu ny dn n s tranh chp khi bin dch v C# ch cho php mt tn duy nht. Chc chn rng khi chng ta phi i tn ca lp t in m ta va to thnh mt ci tn khc chng hn nh myDictionary. Khi s lm cho vic pht trin cc ng dng tr nn phc tp, cng knh. n mt s pht trin nht nh no th chnh l cn c mng cho nh pht trin. Gii php gii quyt vn ny l vic to ra mt namespace, namsespace s hn ch phm vi ca mt tn, lm cho tn ny ch c ngha trong vng nh ngha. Gi s c mt ngi ni Tng l mt k s, t k s phi i km vi mt lnh vc nht nh no , v nu khng th chng ta s khng bit c l anh ta l k s cu ng, c kh hay phn mm. Khi mt lp trnh vin C# s bo rng Tng l CauDuong.KySu phn bit vi CoKhi.KySu hay PhanMem.KySu. Namespace trong trng hp ny l
CauDuong, CoKhi, PhanMem s
vng khng gian tn sau c ngha. Tng t nh vy ta c to cc namespace phn thnh cc vng cho cc lp trng tn khng tranh chp vi nhau. Tng t nh vy, .NET Framework c xy dng mt lp Dictionary bn trong namespace System.Collections, v tng ng ta c th to mt lp Dictionary 42
Ngn Ng C#
khc nm trong namespace ProgramCSharp.DataStructures, iu ny hon ton khng dn n s tranh chp vi nhau.
43
Ngn Ng C#
Trong v d minh ha 1.2 i tng Consoleb hn ch bi namespace bng vic s dng m lnh:
System.Console.WriteLine();
Ton t .
Trong vd 2.2 trn du . c s dng truy cp n phng thc hay d liu trong mt lp (trong trng hp ny phng thc l WriteLine()), v ngn cch gia tn lp n mt namespace xc nhn (namspace System v lp l Console). Vic thc hin ny theo hng t trn xung, trong mc u tin namespace l System, tip theo l lp Console, v cui cng l truy cp n cc phng thc hay thuc tnh ca lp. Trong nhiu trng hp namespace c th c chia thnh cc namespace con gi l subnamespace. V d trong namespace System c cha mt s cc subnamesapce nh Configuration, Collections, Data, v cn rt nhiu na, hn na trong namespace Collectioncn chia thnh nhiu namesapce con na. Namespace gip chng ta t chc v ngn cch nhng kiu. Khi chng ta vit mt chng trnh C# phc tp, chng ta c th phi to mt kin trc namespace ring cho mnh, v khng gii hn chiu su ca cy phn cp namespace. Mc ch ca namespace l gip chng ta chia qun l nhng kin trc i tng phc tp.
T kha using
lm cho chng trnh gn hn, v khng cn phi vit tng namespace cho tng i tng, C# cung cp t kha l using, sau t kha ny l mt namespace hay subnamespace vi m t y trong cu trc phn cp ca n. Ta c th dng dng lnh :
usingSystem;
u chng trnh v khi trong chng trnh nu chng ta c dng i tng Consoleth khng cn phi vit y : System.Console. m ch cn vit Console. thi. V d 2.3: Dng kha using ----------------------------------------------------------------------------usingSystem; classChaoMung { staticvoidMain() { //Xuatramanhinhchuoithongbao Console.WriteLine(ChaoMung); } Ngn Ng C#
44
-----------------------------------------------------------------------------
45
Ngn Ng C#
Kt qu:
Chao Mung
----------------------------------------------------------------------------Lu rng phi t cu using Systemtrc nh ngha lp ChaoMung. Mc d chng ta ch nh rng chng ta s dng namespace System, v khng ging nh cc ngn ng khc, khng th ch nh rng chng ta s dng i tng System.Console. V d 2.4: Khng hp l trong C#. ----------------------------------------------------------------------------usingSystem.Console; classChaoMung { staticvoidMain() { //Xuatramanhinhchuoithongbao WriteLine(ChaoMung); } }
Cch biu din namespace c th lm gim nhiu thao tc g bn phm, nhng n c th s khng em li li ch no bi v n c th lm xo trn nhng namespace c tn khng khc nhau. Gii php chung l chng ta s dng t kha using vi cc namespace c xy dng sn, cc namespace do chng ta to ra, nhng namespace ny chng ta nm chc su liu v n. Cn i vi namespace do cc hng th ba cung cp th chng ta khng nn dng t kha using.
php lc (camel notation) cho tn bin v c php Pascal cho hm, hng, v thuc tnh. V d :
47
Ngn Ng C#
Bin myDictionarytheo cch t tn c php lc . Hm DrawLine, thuc tnh ColorBackgroundtheo cch t tn c php Pascal.
T kha static
Hm Main() trong v d minh ha trn c nhiu hn mt cch thit k. Trong minh ha ny hm Main()c khai bo vi kiu tr v l void, tc l hm ny khng tr v bt c gi tr no c. i khi cn kim tra chng trnh c thc hin ng hay khng, ngi lp trnh c th khai bo hm Main()tr v mt gi tr no xc nh kt qu thc hin ca chng trnh. Trong khai bo ca v d trn c dng t kha static:
staticvoidMain() { ....... }
T kha ny ch ra rng hm Main()c th c gi m khng cn phi to i tng ChaoMung. Nhng vn lin quan n khai bo lp, phng thc, hay thuc tnh s c trnh by chi tit trong cc chng tip theo.
c thit k.
49
Ngn Ng C#
u tin chng ta s m chng trnh Notepad ri son tho chng trnh minh ha trn, lu l ta c th s dng bt c trnh son tho vn bn no ch khng nht thit l Notepad. Sau khi son tho xong th lu tp tin xung a v tp tin ny c phn m rng l *.cs, trong v d ny l chaomung.cs. Bc tip theo l bin dch tp tin ngun va to ra. bin dch ta dng trnh bin dch dng lnh C# (csc.exe) chng trnh ny c chp vo my trong qu trnh ci .NET Framework. bit csc.exe nm chnh xc v tr no trong a ta c th dng chc nng tm kim ca Windows. thc hin bin dch chng ta m mt ca s dng lnh ri nh vo lnh theo mu sau:
csc.exe[/out:<filethcthi>]<filengun>
V d: csc.exe/out:d:\chaomung.exed:\chaomung.cs Thng th khi bin dch ta ch cn hai phn l tn ca trnh bin dch v tn tp tin ngun m thi. Trong mu trn c dng mt trong nhiu ty chn khi bin dch l /out, theo sau l tn ca chng trnh thc thi hay chnh l kt qu bin dch tp tin ngun. Cc tham s ty chn c rt nhiu nu mun tm hiu chng ta c th dng lnh:
csc.exe/?
Lnh ny xut ra mn hnh ton b cc ty chn bin dch v cc hng dn s dng. Hai hnh sau minh ha qu trnh nhp m ngun chng trnh C# bng mt trnh son tho vn bn n gin nh Notepad trong Windows. V sau bin dch tp tin m ngun va to ra bng chng trnh csc.exe mt trnh bin dch dng lnh ca C#. Kt qu l mt tp tin thc thi c to ra v ta s chy chng trnh ny.
50
Ngn Ng C#
(hnh 2.4 bn di). Nu nh chng trnh Visual Studio .NET c chy ln u tin, khi ca s NewProjects xut hin t ng m khng cn phi kch hot. to ng dng, ta la chn mc VisualC#Projectstrong ca s ProjectTypebn tri. Lc ny chng ta c th nhp tn cho ng dng v la chn th mc ni lu tr cc tp tin ny. Cui cng, kch vo OKkhi mi chuyn khi to chm dt v mt ca s mi s xut hin (hnh 2.4 bn di), chng ta c th nhp m ngun vo y. Lu rng Visual Studio .NET to ra mt namespace da trn tn ca project m ta va cung cp (ChaoMung), v thm vo ch dn s dng namespace System bng lnh using, bi hu nh mi chng trnh m chng ta vit u cn s dng cc kiu d liu cha trong namespace System.
51
Ngn Ng C#
Hnh 2.5: Phn son tho m ngun cho project. Visual Studio .NET to mt lp tn l Class1, lp ny chng ta c th ty i tn ca chng. Khi i tn ca lp, tt nht l i tn lun tp tin cha lp (Class1.cs). 52
Ngn Ng C#
Gi s
53
Ngn Ng C#
trong v d trn chng ta i tn ca lp thnh ChaoMung, v i tn tp tin Class1.cs (i tn tp tin trong ca s SolutionExplorer). Cui cng, Visual Studio .NET to mt khung sn chng trnh, v kt thc vi ch thch
TODOl
b tham s string[]argsca hm Main()v xa tt c cc ch thch bn trong ca hm. Sau nhp vo dng lnh sau bn trong thn ca hm Main()
//Xuatramanhinh System.Console.WriteLine(ChaoMung);
Sau tt c cng vic , tip theo l phn bin dch chng trnh t Visual Studio .NET. Thng thng thc hin mt cng vic no ta c th chn kch hot chc nng trong menu, hay cc button trn thanh toolbar, v cch nhanh nht l s dng cc phm nng hay cc phm kt hp gi nhanh mt chc nng. Trong v d, bin dch chng trnh nhn Ctrl-Shift-B hoc chn chc nng: Build BuildSolution. Mt cch khc na l dng nt lnh trn thanh toolbar: chy chng trnh va c to ra m khng s dng ch debug chng ta c th nhn Ctrl-F5 hay chn Debug Start Without Debugging hoc nt lnh trn thanh toolbar ca Visual Studio . NET Ghi ch: Tt hn ht l chng ta nn b ra nhiu thi gian tm hiu hay khm ph mi trng pht trin Visual Studio .NET. y cng l cch thc tt m nhng ngi pht trin ng dng v chng ta nn thc hin. Vic tm hiu Visual Studio .NET v thng tho n s gip cho chng ta rt nhiu trong qu trnh xy dng v pht trin ng dng sau ny.
Cu hi v tr li
Cuhi 1: Mt chng trnh C# c th chy trn bt c my no? Tr li 1: Khng phi tt c. Mt chng trnh C# ch chy trn my c Common Language Runtime (CLR) c ci t. Nu chng ta copy mt chng trnh exe ca C# qua mt my khng c CLR th chng ta s nhn c mt li. Trong nhng phin bn ca Windows khng c CLR chng ta s c bo rng thiu tp tin DLL. Cu hi 2: Nu mun a chng trnh m ta vit cho mt ngi bn th tp tin no m chng ta cn a? Tr li 2: Thng thng cch tt nht l a chng trnh bin dch. iu ny c ngha rng sau khi m ngun c bin dch, chng ta s c mt chng trnh thc thi (tp tin c phn m rng *.exe ). Nh vy, nu chng ta mun a chng trnh Chaomung cho tt c nhng ngi bn ca chng ta th ch cn a tp tin Chaomung.exe. Khng cn thit phi a tp tin ngun Chaomung.cs. V nhng ngi bn ca chng ta khng cn thit phi c trnh bin dch C#. H ch cn c C# runtime 54
Ngn Ng C#
trn my tnh (nh CLR ca Microsoft) l c th chy c chng trnh ca chng ta. Cuhi 3: Sau khi to ra c tp tin thc thi .exe. C cn thit gi li tp tin ngun khng?
55
Ngn Ng C#
Tr li 3: Nu chng ta t b tp tin m ngun th sau ny s rt kh khn cho vic m rng hay thay i chng trnh, do cn thit phi gi li cc tp tin ngun. Hu ht cc IDE to ra cc cc tp tin ngun (.cs) v cc tp tin thc thi. Cng nh gi cc tp tin ngun chng ta cng cn thit phi gi cc tp tin khc nh l cc ti nguyn bn ngoi cc icon, image, form.. Chng ta s lu gi nhng tp tin ny trong trng hp chng ta cn thay i hay to li tp tin thc thi. Cu hi 4: Nu trnh bin dch C# a ra mt trnh son tho, c phi nht thit phi s dng n? Tr li 4: Khng hon ton nh vy. Chng ta c th s dng bt c trnh son tho vn bn no v lu m ngun di dng tp tin vn bn. Nu trnh bin dch a ra mt trnh son tho th chng ta nn s dng n. Nu chng ta c mt trnh son tho khc tt hn chng ta c th s dng n. Mt s cc tin ch son tho m ngun c th gip cho ta d dng tm cc li c php, gip to mt s m ngun t ng n gin...Ni chung l ty theo chng ta nhng theo ti th Visual Studio .NET cng kh tt s dng Cuhi 5: C th khng quan tm n nhng cnh bo khi bin dch m ngun Tr li 5: Mt vi cnh bo khng nh hng n chng trnh khi chy, nhng mt s khc c th nh hng n chng trnh chy. Nu trnh bin dch a ra cnh bo, tc l tn hiu cho mt th g khng ng. Hu ht cc trnh bin dch cho php chng ta thit lp mc cnh bo. Bng cch thit lp mc cnh bo chng ta c th ch quan tm n nhng cnh bo nguy him, hay nhn ht tt c nhng cnh bo. Ni chung cch tt nht l chng ta nn xem tt c nhng cnh bo sa cha chng, mt chng trnh tm gi l t yu cu khi khng c li bin dch v cng khng c cnh bo (nhng cha chc chy ng kt qu!).
Cu hi thm
Cuhi 1: Hy a ra 3 l do ti sao ngn ng C# l mt ngn ng lp trnh tt? Cuhi 2: IL v CLR vit tt cho t no v ngha ca n? Cuhi 3: a ra cc bc c bn trong chu trnh xy dng chng trnh? Cu hi 4: Trong bin dch dng lnh th lnh no c s dng bin dch m ngun .cs v lnh ny gi chng trnh no? Cuhi 5: Phn m rng no m chng ta nn s dng cho tp tin m ngun C#? Cu hi 6: Mt tp tin .txt cha m ngun C# c phi l mt tp tin m ngun C# hp l hay khng? C th bin dch c hay khng? 56
Ngn Ng C#
Cu hi 7: Ngn ng my l g? Khi bin dch m ngun C# ra tp tin .exe th tp tin ny l ngn ng g? Cu hi 8: Nu thc thi mt chng trnh bin dch v n khng thc hin ng nh mong i ca chng ta, th iu g chng ta cn phi lm? Cuhi 9: Mt li tng t nh bn di thng xut hin khi no?
57
Ngn Ng C#
mycode.cs(15,5): error CS1010: NewLine in constan Cuhi 10: Ti sao phi khai bo static cho hm Mainca lp? Cu hi 11: Mt m ngun C# c phi cha trong cc lp hay l c th tn ti bn ngoi lp nh C/C++? Cu hi 12: So snh s khc nhau c bn gia C# v C/C++, C# vi Java, hay bt c ngn ng cp cao no m bn bit? Cu hi 13: Con tr c cn c s dng trong C# hay khng? Nu c th n c qun l nh th no? Cu hi 14: Khi nim v ngha ca namespace trong C#? iu g xy ra nu nh ngn ng lp trnh khng h tr namespace?
Bi tp
Bi tp 1: Dng trnh son tho vn bn m chng trnh exe m ta bin dch t cc chng trnh ngun trc v xem s khc nhau gia hai tp tin ny, lu sao khi ng tp tin ny ta khng chn lu tp tin. Bi tp 2: Nhp vo chng trnh sau v bin dch n. Cho bit chng trnh thc hin iu g? ----------------------------------------------------------------------------usingSystem; classvariables { publicstaticvoidMain() { intradius=4; constdoublePI=3.14159; doublecircum,area; area=PI*radius*radius; circum=2*PI*radius; //inktqu Console.WriteLine(Bankinh={0},PI={1},radius,PI); Console.WriteLine(Dientich{0},area);Console.WriteLine(Chuvi {0},circum); } }
----------------------------------------------------------------------------Bi tp3: Nhp vo chng trnh sau v bin dch. Cho bit chng trnh thc hin iu g? 58
Ngn Ng C#
----------------------------------------------------------------------------classAClass
59
Ngn Ng C#
----------------------------------------------------------------------------Bi tp4: Chng trnh sau c cha li. Nhp vo v sa nhng li --------------------------------------------------------------------------------------------------------------------------------------------------------Bi tp5: Sa li v bin dch chng trnh sau ----------------------------------------------------------------------------classTest { pubicstaticvoidMain() { Console.WriteLine(Xinchao); Consoile.WriteLine(Tambiet); } }
----------------------------------------------------------------------------Bi tp6: Sa li v bin dch chng trnh sau ----------------------------------------------------------------------------classTest { pubicvoidMain() { Console.WriteLine(Xinchao); Consoile.WriteLine(Tambiet); } }
60
61
Ngn Ng C#
Chng 3
NN TNG NGN NG C#
Kiu d liu
Kiu d liu xy dng sn Chn kiu d liu Chuyn i cc kiu d liu
Bin v hng
Gn gi tr xc nh cho bin Hng Kiu lit k Kiu chui k t nh danh
62
Nn Tng Ngn Ng C#
Trong chng trc chng ta tm hiu mt chng trnh C# n gin nht. Chng trnh cha din t mt chng trnh vit bng ngn ng C#, c qu nhiu phn v chi tit b qua. Do vy trong chng ny chng ta s i su vo tm hiu cu trc v c php ca ngn ng C#. Chng ny s tho lun v h thng kiu d liu, phn bit gia kiu d liu xy dng sn (nh int, bool, string) vi kiu d liu do ngi dng nh ngha (lp hay cu trc do ngi lp trnh to ra...). Mt s c bn khc v lp trnh nh to v s dng bin d liu hay hng cng c cp cng vi cu trc lit k, chui, nh danh, biu thc v cu lnh. Trong phn hai ca chng hng dn v minh ha vic s dng lnh phn nhnh if, switch, while, do...while, for, v foreach. V cc ton t nh php gn, php ton logic, php ton quan h, v ton hc... Nh chng ta bit C# l mt ngn ng hng i tng rt mnh, v cng vic ca ngi lp trnh l k tha to v khai thc cc i tng. Do vy nm vng v pht trin tt ngi lp trnh cn phi i t nhng bc i du tin tc l i vo tm hiu nhng phn c bn v ct li nht ca ngn ng.
Kiu d liu
C# l ngn ng lp trnh mnh v kiu d liu, mt ngn ng mnh v kiu d liu l phi khai bo kiu ca mi i tng khi to (kiu s nguyn, s thc, kiu chui, kiu iu khin...) v trnh bin dch s gip cho ngi lp trnh khng b li khi ch cho php mt loi kiu d liu c th c gn cho cc kiu d liu khc. Kiu d liu ca mt i tng l mt tn hiu trnh bin dch nhn bit kch thc ca mt i tng (kiu intc kch thc l 4 byte) v kh nng ca n (nh mt i tng buttonc th v, phn ng khi nhn,...). Tng t nh C++ hay Java, C# chia thnh hai tp hp kiu d liu chnh: Kiu xy dng sn (built- in) m ngn ng cung cp cho ngi lp trnh v kiu c ngi dng nh ngha (user-defined) do ngi lp trnh to ra. C# phn tp hp kiu d liu ny thnh hai loi: Kiu d liu gi tr (value) v kiu d liu tham chiu (reference). Vic phn chi ny do s khc nhau khi lu kiu d liu gi tr v kiu d liu tham chiu trong b nh. i vi mt kiu d liu gi tr th s c lu gi kch thc tht trong b nh cp pht l stack. Trong khi th a ch ca kiu d liu tham chiu th c lu trong stacknhng i tng tht s th lu trong b nh heap. Nu chng ta c mt i tng c kch thc rt ln th vic lu gi chng trn b nh heap rt c ch, trong chng 4 s trnh by nhng li ch v bt li khi lm vic vi 63
Nn Tng Ngn Ng C#
kiu d liu tham chiu, cn trong chng ny ch tp trung kiu d kiu c bn hay kiu xy dng sn. Ghi ch: Tt c cc kiu d liu xy dng sn l kiu d liu gi tr ngoi tr cc i tng v chui. V tt c cc kiu do ngi dng nh ngha ngoi tr kiu cu trc u l kiu d liu tham chiu.
64
Nn Tng Ngn Ng C#
Ngoi ra C# cng h tr mt kiu con tr C++, nhng him khi c s dng, v ch khi no lm vic vi nhng on m lnh khng c qun l (unmanaged code). M lnh khng c qun l l cc lnh c vit bn ngoi nn .MS.NET, nh l cc i tng COM.
. NET.
Bng 3.1 sau s m t mt s cc kiu d liu c xy dng sn Kiu C# S byte Kiu .NET M t 1 S nguyn dng khng du t 0-255 byte Byte
char bool sbyte short ushort int uint float double
2 1 1 2 2 4 4 4 8
K t Unicode Gi tr logic true/ false S nguyn c du ( t -128 n 127) S nguyn c du gi tr t -32768 n 32767. S nguyn khng du 0 65.535 S nguyn c du 2.147.483.647 2.147.483.647 v
S nguyn khng du 0 4.294.967.295 Kiu du chm ng, gi tr xp x t 3,4E38 n 3,4E+38, vng hc s chnh xc Kiu du chm i 7 c c ngha.. gp i, gi tr xp x t 1,7E-308 n 1,7E+308,
decimal
Decimal
C chnh xc n 28 con s v gi tr thp phn, c dng trong tnh ton ti chnh, kiu ny i hi phi c hu t m hay M 65
Nn Tng Ngn Ng C#
long
Int64
ulong
Uint64
Bng 3.1 : M t cc kiu d liu xy dng sn. Ghi ch: Kiu gi tr logic ch c th nhn c gi tr l truehay false m thi. Mt gi tr nguyn khng th gn vo mt bin kiu logic trong C# v khng c bt c chuyn i ngm nh no. iu ny khc vi C/C++, cho php bin logic c gn gi tr nguyn, khi gi tr nguyn 0 l falsev cc gi tr cn li l true.
thng da vo ln ca gi tr mun s dng. V d, mt bin ushortc th lu gi gi tr t 0 n 65.535, trong khi bin ulong c th lu gi gi tr t 0 n 4.294.967.295, do ty vo min gi tr ca phm vi s dng bin m chn cc kiu d liu thch hp nht. Kiu d liu int thng c s dng nhiu nht trong lp trnh v vi kch thc 4 byte ca n cng lu cc gi tr nguyn cn thit. Kiu s nguyn c du thng c la chn s dng nhiu nht trong kiu s tr khi c l do chnh ng s dng kiu d liu khng du. Stack v Heap
66
Nn Tng Ngn Ng C#
Stack l
vo sau ra trc (Last In First Out : LIFO), iu ny ging nh chng ta c mt chng cc a, ta c xp cc a vo chng v khi ly ra th a no nm trn cng s c lp ra trc, tc l a vo sau s c ly ra trc. Trong C#, kiu gi tr nh kiu s nguyn c cp pht trn stack, y l vng nh c thit lp lu cc gi tr, v vng nh ny c tham chiu bi tn ca bin. Kiu tham chiu nh cc i tng th c cp pht trn heap. Khi mt i tng c cp pht trn heap th a ch ca n c tr v, v a ch ny c gn n mt tham chiu. Thnh thong c ch thu gom s hy i tng trong stack sau khi mt vng trong stackc nh du l kt thc. Thng thng mt vng trong stack c nh ngha bi mt hm. Do , nu chng ta khai bo mt bin cc b trong mt hm l mt i tng th i tng ny s nh du hy khi kt thc hm. Nhng i tng trn heap s c thu gom sau khi mt tham chiu cui cng n i tng c gi. Cch tt nht khi s dng bin khng du l gi tr ca bin lun lun dng, bin ny thng th hin mt thuc tnh no c min gi tr dng. V d khi cn khai bo mt bin lu gi tui ca mt ngi th ta dng kiu byte (s nguyn t 0-255) v tui ca ngi khng th no m c. Kiu float, double, v decimal a ra nhiu mc khc nhau v kch thc cng nh chnh xc.Vi thao tc trn cc phn s nh th kiu floatl thch hp nht. Tuy nhin lu rng trnh bin dch lun lun hiu bt c mt s thc no cng l mt s kiu
doubletr
sau.
floatsoFloat=24f;
Kiu d liu k t th hin cc k t Unicode, bao gm cc k t n gin, k t theo m Unicode v cc k t thot khc c bao trong nhng du nhy n. V d, A l mt k t n gin trong khi \u0041 l mt k t Unicode. K t thot l nhng k t c bit bao gm hai k t lin tip trong k t du tin l du cho \. V d, \t l du tab. Bng 3.2 trnh by cc k t c bit. K t
Nn Tng Ngn Ng C#
ngha
67
\ \ \\ \0 \a
68
Nn Tng Ngn Ng C#
\b \f \n \r \t \v
Backspace Sang trang form feed Dng mi u dng Tab ngang Tab dc Bng 3.2 : Cc kiu k t c bit.
Tuy nhin, nu chng ta thc hin chuyn i ngc li, chc chn chng ta s b mt thng tin. Nu gi tr ca s nguyn ln hn 32.767 th n s b ct khi chuyn i. Trnh bin dch s khng thc hin vic chuyn i ngm nh t s kiu intsang s kiu short:
shortx; inty=100; x=y; //Khngbindch,li!!!
khng b li chng ta phi dng lnh gn tng minh, on m trn c vit li nh sau:
shortx; inty=500; x=(short)y; //pkiutngminh,trnhbindchkhngboli
Bin v hng
Mt bin l mt vng lu tr vi mt kiu d liu. Trong v d trc c x, v y iu l bin. Bin c th c gn gi tr v cng c th thay i gi tr khi thc hin cc lnh trong chng trnh. to mt bin chng ta phi khai bo kiu ca bin v gn cho bin mt tn duy nht. 69
Nn Tng Ngn Ng C#
Bin c th c khi to gi tr ngay khi c khai bo, hay n cng c th c gn mt gi tr mi vo bt c lc no trong chng trnh. V d 3.1 sau minh ha s dng bin. V d 3.1: Khi to v gn gi tr n mt bin. -----------------------------------------------------------------------------
70
Nn Tng Ngn Ng C#
----------------------------------------------------------------------------Kt qu:
Sau khi khoi tao: bien1 = 9 Sau khi gan: bien1 = 15
----------------------------------------------------------------------------Ngay khi khai bo bin ta gn gi tr l 9 cho bin, khi xut bin ny th bin c gi tr l 9. Thc hin php gn bin cho gi tr mi l 15 th bin s c gi tr l 15 v xut kt qu l 15.
Gn gi tr xc nh cho bin
C# i hi cc bin phi c khi to trc khi c s dng. kim tra lut ny chng ta thay i dng lnh khi to bin bien1 trong v d 3.1 nh sau:
intbien1;
v gi nguyn phn cn li ta c v d 3.2: V d 3.2: S dng mt bin khng khi to. ----------------------------------------------------------------------------classMinhHoaC3 { staticvoidMain() { intbien1; System.Console.WriteLine(Saukhikhoitao:bien1={0},bien1); bien1=15; System.Console.WriteLine(Saukhigan:bien1={0},bien1); } }
----------------------------------------------------------------------------Khi bin dch on chng trnh trn th trnh bin dch C# s thng bo mt li sau:
Nn Tng Ngn Ng C#
71
...errorCS0165:Useofunassignedlocalvariablebien1
72
Nn Tng Ngn Ng C#
Vic s dng bin khi cha c khi to l khng hp l trong C#. V d 3.2 trn khng hp l . Tuy nhin khng nht thit lc no chng ta cng phi khi to bin. Nhng dng c th bt buc phi gn cho chng mt gi tr trc khi c mt lnh no tham chiu n bin . iu ny c gi l gn gi tr xc nh cho bin v C# bt buc phi thc hin iu ny. V d 3.3 minh ha mt chng trnh ng. V d 3.3: Bin khng c khi to nhng sau c gn gi tr. ----------------------------------------------------------------------------classMinhHoaC3 { staticvoidMain() { intbien1; bien1=9; System.Console.WriteLine(Saukhikhoitao:bien1={0},bien1); bien1=15; System.Console.WriteLine(Saukhigan:bien1={0},bien1); } }
-----------------------------------------------------------------------------
Hng
Hng cng l mt bin nhng gi tr ca hng khng thay i. Bin l cng c rt mnh, tuy nhin khi lm vic vi mt gi tr c nh ngha l khng thay i, ta phi m bo gi tr ca n khng c thay i trong sut chng trnh. V d, khi lp mt chng trnh th nghim ha hc lin quan n nhit si, hay nhit ng ca nc, chng trnh cn khai bo hai bin l DoSoi v DoDong, nhng khng cho php gi tr ca hai bin ny b thay i hay b gn. ngn nga vic gn gi tr khc, ta phi s dng bin kiu hng. Hng c phn thnh ba loi: gi tr hng (literal), biu tng hng (symbolic constants), kiu liu k (enumerations). Gi tr hng: ta c mt cu lnh gn nh sau:
x=100;
Biu tng hng: gn mt tn cho mt gi tr hng, to mt biu tng hng dng t kha
constv c
php sau:
<const><type><tnhng>=<gitr>;
74
Nn Tng Ngn Ng C#
Mt biu tng hng phi c khi to khi khai bo, v ch khi to duy nht mt ln trong sut chng trnh v khng c thay i. V d:
constintDoSoi=100;
Trong khai bo trn, 32 l mt hng s v DoSoil mt biu tng hng c kiu nguyn. V d 3.4 minh ha vic s dng nhng biu tng hng. Vi d 3.4: S dng biu tng hng. ----------------------------------------------------------------------------classMinhHoaC3 { staticvoidMain() { constintDoSoi=100; constintDoDong=0; //C //C
System.Console.WriteLine(Dodongcuanuoc{0},DoDong); System.Console.WriteLine(Dosoicuanuoc{0},DoSoi); } }
----------------------------------------------------------------------------Kt qu:
Do dong cua nuoc 0 Do soi cua nuoc 100
----------------------------------------------------------------------------V d 3.4 to ra hai biu tng hng cha gi tr nguyn: DoSoiv DoDong, theo qui tc t tn hng th tn hng thng c t theo c php Pascal, nhng iu ny khng i hi bi ngn ng nn ta c th t ty . Vic dng biu thc hng ny s lm cho chng trnh c vit tng thm phn ngha cng vi s d hiu. Tht s chng ta c th dng hng s l 0 v 100 thay th cho hai biu tng hng trn, nhng khi chng trnh khng c d hiu v khng c t nhin lm. Trnh bin dch khng bao gi chp nhn mt lnh gn gi tr mi cho mt biu tng hng. V d 3.4 trn c th c vit li nh sau ...
classMinhHoaC3 { staticvoidMain() { constintDoSoi=100; Nn Tng Ngn Ng C# //C
75
constintDoDong=0;
//C
System.Console.WriteLine(Dodongcuanuoc{0},DoDong);
76
Nn Tng Ngn Ng C#
System.Console.WriteLine(Dosoicuanuoc{0},DoSoi); DoSoi=200; } }
Kiu lit k
Kiu lit k n gin l tp hp cc tn hng c gi tr khng thay i (thng c gi l danh sch lit k). Trong v d 3.4, c hai biu tng hng c quan h vi nhau:
constintDoDong=0; constintDoSoi=100;
Do mc ch m rng ta mong mun thm mt s hng s khc vo danh sch trn, nh cc hng sau:
constintDoNong=60; constintDoAm=40;const intDoNguoi=20;
Cc biu tng hng trn iu c ngha quan h vi nhau, cng ni v nhit ca nc, khi khai bo tng hng trn c v cng knh v khng c lin kt cht ch cho lm. Thay vo C# cung cp kiu lit k gii quyt vn trn:
enumNhietDoNuoc { DoDong=0, DoNguoi=20, DoAm=40, DoNong=60, DoSoi=100, }
Mi kiu lit k c mt kiu d liu c s, kiu d liu c th l bt c kiu d liu nguyn no nh int, short, long... tuy nhin kiu d lu ca lit k khng chp nhn kiu k t. khai bo mt kiu lit k ta thc hin theo c php sau:
[thuctnh][bsung]enum<tnlitk>[:kiucs]{danhschccthnhphnlitk};
Thnh phn thuc tnh v b sung l t chn s c trnh by trong phn sau ca sch. 77
Nn Tng Ngn Ng C#
Trong phn ny chng ta s tp trung vo phn cn li ca khai bo. Mt kiu lit k bt u vi t kha enum, tip sau l mt nh danh cho kiu lit k:
78
Nn Tng Ngn Ng C#
enumNhietDoNuoc
Thnh phn kiu c s chnh l kiu khai bo cho cc mc trong kiu lit k. Nu b qua thnh phn ny th trnh bin dch s gn gi tr mc nh l kiu nguyn int, tuy nhin chng ta c th s dng bt c kiu nguyn no nh ushorthay long,..ngoi tr kiu k t. on v d sau khai bo mt kiu lit k s dng kiu c s l s nguyn khng du uint:
enumKichThuoc:uint { Nho = 1, Vua = 2, Lon=3, }
Lu l khai bo mt kiu lit k phi kt thc bng mt danh sch lit k, danh sch lit k ny phi c cc hng c gn, v mi thnh phn phi phn cch nhau du phy. Ta vit li v d minh ha 3-4 nh sau. V d 3.5: S dng kiu lit k n gin chng trnh. ----------------------------------------------------------------------------classMinhHoaC3 { //Khaibokiulitk enumNhietDoNuoc { DoDong=0, DoNguoi=20, DoAm=40, DoNong=60, DoSoi=100, } staticvoidMain() { System.Console.WriteLine(Nhietdodong:{0},NhietDoNuoc.DoDong); System.Console.WriteLine(Nhietdonguoi:{0},NhietDoNuoc.DoNguoi); System.Console.WriteLine(Nhietdoam:{0},NhietDoNuoc.DoAm); System.Console.WriteLine(Nhietdonong:{0},NhietDoNuoc.DoNong); System.Console.WriteLine(Nhietdosoi:{0},NhietDoNuoc.DoSoi); Nn Tng Ngn Ng C#
79
} }
----------------------------------------------------------------------------Kt qu:
80
Nn Tng Ngn Ng C#
Nhiet do dong: 0 Nhiet do nguoi: 20 Nhiet do am: 40 Nhiet do nong: 60 Nhiet do soi: 100
----------------------------------------------------------------------------Mi thnh phn trong kiu lit k tng ng vi mt gi tr s, trong trng hp ny l mt s nguyn. Nu chng ta khng khi to cho cc thnh phn ny th chng s nhn cc gi tr tip theo vi thnh phn u tin l 0. Ta xem th khai bo sau:
enumThutu { ThuNhat, ThuHai, ThuBa=10, ThuTu }
11.
Kiu lit k l mt kiu hnh thc do bt buc phi thc hin php chuyn i tng minh vi cc kiu gi tr nguyn:
intx=(int)ThuTu.ThuNhat;
Kiu chui k t
Kiu d liu chui kh thn thin vi ngi lp trnh trong bt c ngn ng lp trnh no, kiu d liu chui lu gi mt mng nhng k t. khai bo mt chui chng ta s dng t kho string tng t nh cch to mt th hin ca bt c i tng no:
stringchuoi;
nh danh
nh danh l tn m ngi lp trnh ch nh cho cc kiu d liu, cc phng thc, 81
Nn Tng Ngn Ng C#
bin, hng, hay i tng.... Mt nh danh phi bt u vi mt k t ch ci hay du gch di, cc k t cn li phi l k t ch ci, ch s, du gch di.
82
Nn Tng Ngn Ng C#
Theo qui c t tn ca Microsoft th ngh s dng c php lc (camel notation) bt u bng k t thng t tn cho cc bin l c php Pascal (Pascal notation) vi k t u tin hoa cho cch t tn hm v hu ht cc nh danh cn li. Hu nh Microsoft khng cn dng c php Hungary nh iSoNguyen hay du gch di
Bien_Nguyen
t cc nh danh.
Cc nh danh khng c trng vi cc t kho m C# a ra, do chng ta khng th to cc bin c tn nh classhay intc. Ngoi ra, C# cng phn bit cc k t thng v k t hoa v vy C# xem hai bin bienNguyenv bienguyenl hon ton khc nhau.
Biu thc
Nhng cu lnh m thc hin vic nh gi mt gi tr gi l biu thc. Mt php gn mt gi tr cho mt bin cng l mt biu thc:
var1=24;
Trong cu lnh trn php nh gi hay nh lng chnh l php gn c gi tr l 24 cho bin
var1.
th bin bn tri s nhn gi tr ca phn bn phi. Cc ton t ca ngn ng C# nh php so snh hay php gn s c trnh by chi tit trong mc ton t ca chng ny. Do var1=24l mt biu thc c nh gi tr l 24 nn biu thc ny c th c xem nh phn bn phi ca mt biu thc gn khc:
var2=var1=24;
Lnh ny s c thc hin t bn phi sang khi bin var1s nhn c gi tr l 24 v tip sau th var2cng c nhn gi tr l 24. Do vy c hai bin u cng nhn mt gi tr l 24. C th dng lnh trn khi to nhiu bin c cng mt gi tr nh:
a=b=c=d=24;
hay
var1 =24;
v trnh bin dch C# s xem hai cu lnh trn l hon ton ging nhau. Tuy nhin lu l khong trng trong mt chui s khng c b qua. Nu chng ta vit:
System.WriteLine(Xinchao!);
84
Nn Tng Ngn Ng C#
Hu ht vic s dng khong trng nh mt s ty ca ngi lp trnh. iu ct yu l vic s dng khong trng s lm cho chng trnh d nhn d c hn Cng nh khi ta vit mt vn bn trong MS Word nu khng trnh by tt th s kh c v gy mt cm tnh cho ngi xem. Cn i vi trnh bin dch th vic dng hay khng dng khong trng l khng khc nhau. Tuy nhin, cng cn lu khi s dng khong trng nh sau:
intx=24;
tng t nh:
intx=24;
Trnh bin dch nhn bit c cc khong trng hai bn ca php gn l ph v c th b qua, nhng khong trng gia khai bo kiu v tn bin th khng phi ph hay thm m bt buc phi c ti thiu mt khong trng. iu ny khng c g bt hp l, v khong trng cho php trnh bin dch nhn bit c t kho int v khng th no nhn c intx. Tng t nh C/C++, trong C# cu lnh c kt thc vi du chm phy ;. Do vy c th mt cu lnh trn nhiu dng, v mt dng c th nhiu cu lnh nhng nht thit l hai cu lnh phi cch nhau mt du chm phy.
Cu lnh (statement)
Trong C# mt ch dn lp trnh y c gi l cu lnh. Chng trnh bao gm nhiu cu lnh tun t vi nhau. Mi cu lnh phi kt thc vi mt du chm phy, v d nh:
intx;//mtculnh x=32;//culnhkhc inty=x;//ycnglmtculnh
Nhng cu lnh ny s c x l theo th t. u tin trnh bin dch bt u v tr u ca danh sch cc cu lnh v ln lt i tng cu lnh cho n lnh cui cng, tuy nhin ch ng cho trng hp cc cu lnh tun t khng phn nhnh. C hai loi cu lnh phn nhnh trong C# l : phn nhnh khng c iu kin (unconditional branching statement) v phn nhnh c iu kin (conditional branching statement). Ngoi ra cn c cc cu lnh lm cho mt s on chng trnh c thc hin nhiu ln, cc cu lnh ny c gi l cu lnh lp hay vng lp. Bao gm cc lnh lp for, while, do,
in,
Sau y chng ta s xem xt hai loi lnh phn nhnh ph bin nht trong lp trnh C#.
Khi trnh bin dch x l n tn ca mt hm, th s ngng thc hin hm hin thi m bt u phn nhnh d to mt gi hm mi. Sau khi hm va to thc hin xong v tr v mt gi tr th trnh bin dch s tip tc thc hin dng lnh tip sau ca hm ban u. v d 3.6 minh ha cho vic phn nhnh khi gi hm. V d 3.6: Gi mt hm. ----------------------------------------------------------------------------usingSystem; classGoiHam { staticvoidMain() { Console.WriteLine(HamMainchuanbigoihamFunc()...);Func(); Console.WriteLine(TrolaihamMain()); } staticvoidFunc() { Console.WriteLine(>ToilahamFunc()...); } }
----------------------------------------------------------------------------Kt qu:
Ham Main chuan bi goi ham Func()... ---->Toi la ham Func()... Tro lai ham Main()
----------------------------------------------------------------------------Lung chng trnh thc hin bt u t hm Main x l n dng lnh Func(), lnh
Func() thng
nhnh thc hin hm va gi. Sau khi thc hin xong hm Func, th chng trnh quay li hm Mainv thc hin cu lnh ngay sau cu lnh gi hm Func. T kho phn nhnh khng iu kin thc hin phn nhnh ta gi mt trong cc t kha sau:
statementthrow. goto, break, continue, return,
cp trong chng tip theo. Trong phn ny ch cp chung khng i vo chi tit. Phn nhnh c iu kin Phn nhnh c iu kin c to bi cc lnh iu kin. Cc t kha ca cc lnh
ny nh : if, else, switch. S phn nhnh ch c thc hin khi biu thc iu kin phn nhnh c xc nh l ng.
Cu lnh if...else Cu lnh phn nhnh if...else da trn mt iu kin. iu kin l mt biu thc s c kim tra gi tr ngay khi bt u gp cu lnh . Nu iu kin c kim tra l ng, th cu lnh hay mt khi cc cu lnh bn trong thn ca cu lnh ifc thc hin. Trong cu iu kin if...elseth elsel phn ty chn. Cc cu lnh bn trong thn ca else ch c thc hin khi iu kin ca ifl sai. Do vy khi cu lnh y if...elsec dng th ch c mt trong hai if hoc else c thc hin. Ta c c php cu iu kin if... else sau:
if(biuthciukin) <Khilnhthchinkhiiukinng> [else <Khilnhthchinkhiiukinsai>]
Nu cc cu lnh trong thn ca ifhay elsem ln hn mt lnh th cc lnh ny phi c bao trong mt khi lnh, tc l phi nm trong du khi { }:
if(biuthciukin) { <lnh1> <lnh2> } [else { <lnh1> <lnh2> }] ... ....
Nh trnh by bn trn do else l phn ty chn nn c t trong du ngoc vung [...]. Minh ha 3.7 bn di cch s dng cu lnh if...else. V d 3.7: Dng cu lnh iu kin if...else. ----------------------------------------------------------------------------usingSystem; classExIfElse { staticvoidMain() {
{ Console.WriteLine(var1:{0}>var2:{1},var1,var2); } else { Console.WriteLine(var2:{0}>var1:{1},var2,var1); } var1=30; if(var1>var2) { var2=var1++; Console.WriteLine(Gangiatrivar1chovar2);Console.WriteLine( Tangbienvar1lenmot);Console.WritelLine(Var1={0},var2= {1},var1,var2); } else { var1=var2; Console.WriteLine(Thietlapgiatrivar1=var2); Console.WriteLine(var1={0},var2={1},var1,var2); } } }
----------------------------------------------------------------------------Kt qu:
Gan gia tri var1 cho var2 Tang bien var1 len mot Var1 = 31, var2 = 30
----------------------------------------------------------------------------Trong v d 3.7 trn, cu lnh if u tin s kim tra xem gi tr ca var1 c ln hn gi tr ca var2 khng. Biu thc iu kin ny s dng ton t quan h ln hn (>), cc ton t khc nh nh hn (<), hay bng (==). Cc ton t ny thng xuyn c s dng trong lp trnh v kt qu tr l gi tr ng hay sai. Vic kim tra xc nh gi tr var1 ln hn var2 l sai (v var1 = 10 trong khi var2 = 20), khi cc lnh trong elses c thc hin, v cc lnh ny in ra mn hnh:
var2:20>var1:10
Tip theo n cu lnh if th hai, sau khi thc hin lnh gn gi tr ca var1 = 30, lc ny iu kin if ng nn cc cu lnh trong khi if s c thc hin v kt qu l in ra ba dng sau:
Gangiatrivar1chovar2 Tangbienvar1lenmot Var1=31,var2=30
Cu lnh iflng nhau Cc lnh iu kin if c th lng nhau phc v cho vic x l cc cu iu kin phc tp. Vic ny cng thng xuyn gp khi lp trnh. Gi s chng ta cn vit mt chng trnh c yu cu xc nh tnh trng kt hn ca mt cng dn da vo cc thng tin nh tui, gii tnh, v tnh trng hn nhn, da trn mt s thng tin nh sau: Nu cng dn l nam th tui c th kt hn l 20 vi iu kin l cha c gia nh. Nu cng dn l n th tui c th kt hn l 19 cng vi iu kin l cha c gia nh. Tt c cc cng dn c tui nh hn 19 iu khng c kt hn.
Da trn cc yu cu trn ta c th dng cc lnh if lng nhau thc hin. V d 3.8 sau s minh ha cho vic thc hin cc yu cu trn. V d 3.8: Cc lnh iflng nhau. ----------------------------------------------------------------------------usingSystem; classTinhTrangKetHon { staticvoidMain() { inttuoi; boolcoGiaDinh;//0:chacgianh;1:cgianhbool gioiTinh;//0:giitnhn;1:giitnhnam tuoi=24; coGiaDinh=false;//chacgianh gioiTinh=true;//nam if(tuoi>=19) { if(coGiaDinh==false)
----------------------------------------------------------------------------Kt qu:
Nam co the ket hon
----------------------------------------------------------------------------Theo trnh t kim tra th cu lnh if u tin c thc hin, biu thc iu kin ng do tui c gi tr l 24 ln hn 19. Khi khi lnh trong if s c thc thi. trong khi ny li xut hin mt lnh if khc kim tra tnh trng xem ngi c gia nh cha, kt qu iu kin if l ng v coGiaDinh= false nn biu thc so snh coGiaDinh==false s tr v gi tr ng. Tip tc xt xem gii tnh ca ngi l nam hay n, v ch c nam trn 19 tui mi c kt hn. Kt qu kim tra l nam nn cu lnh ifth ba c thc hin v xut ra kt qu : Nam co the ket hon. Cu lnh switch Khi c qu nhiu iu kin chn thc hin th dng cu lnh ifs rt ri rm v di dng, Cc ngn ng lp trnh cp cao u cung cp mt dng cu lnh switchlit k cc gi tr v ch thc hin cc gi tr thch hp. C# cng cung cp cu lnh nhy switchc c php sau:
switch(biuthciukin) { case<gitr>: <Ccculnhthchin> <lnhnhy> [default: <Ccculnhthchinmcnh>] }
Cng tng t nh cu lnh if, biu thc so snh c t sau t kha switch, tuy nhin gi tr so snh li c t sau mi cc t kha case. Gi tr sau t kha case l cc gi tr hng s nguyn nh cp trong phn trc.
Nu mt cu lnh casec thch hp tc l gi tr sau casebng vi gi tr ca biu thc sau switch th cc cu lnh lin quan n cu lnh case ny s c thc thi. Tuy nhin phi c mt cu lnh nhy nh break, goto iu khin nhy qua cc case khc.V nu khng c cc lnh nhy ny th khi chng trnh s thc hin tt c cc casetheo sau. d hiu hn ta s xem xt v d 3.9 di y. V d 3.9: Cu lnh switch. ----------------------------------------------------------------------------usingSystem; classMinhHoaSwitch { staticvoidMain() { constintmauDo=0;const intmauCam=1;constint mauVang=2;constint mauLuc=3;constint mauLam=4;constint mauCham=5;constint mauTim=6; intchonMau=mauLuc; switch(chonMau) { casemauDo: Console.WriteLine(Banchomaudo); break; casemauCam: Console.WriteLine(Banchomaucam); break; casemauVang: //Console.WriteLine(Banchonmauvang); casemauLuc: Console.WriteLine(Banchonmauluc); break;
----------------------------------------------------------------------------Trong v d 3.9 trn lit k by loi mu v dng cu lnh switch kim tra cc trng hp chn mu. y chng ta th phn tch tg cu lnh case m khng quan tm n gi tr bin chonMau. Gi tr chonMau
mauDo mauCam mauVang mauLuc mauLam
Kt qu thc hin Ban chon mau do Ban chon mau cam Ban chon mau luc Ban chon mau luc Ban chon mau lam Ban chon mau cham Ban chon mau tim Ban chon mau luc Ban chon mau cham Ban chon mau tim Ban chon mau luc Ban chon mau tim Ban chon mau luc
mauCham
mauTim
Bng 3.3: M t cc trng hp thc hin cu lnh switch. Trong on v d do gi tr ca bin chonMau= mauLucnn khi vo lnh switch th case
mauLucs
-----------------------------------------------------------------------------
Kt qu v d 3.9
----------------------------------------------------------------------------Ghi ch: i vi ngi lp trnh C/C++, trong C# chng ta khng th nhy xung mt trng hp case tip theo nu cu lnh case hin ti khng rng. V vy chng ta phi vit nh sau:
case1: case2: //nhyxung
Nh minh ha trn th trng hp x l case 1 l rng, tuy nhin chng ta khng th vit nh sau:
case1: DoAnything(); //Trnghpnykhngthnhyxungcase2 case2:
trong on chng trnh th hai trng hp case 1 c mt cu lnh nn khng th nhy xung c. Nu mun trng hp case1 nhy qua case 2 th ta phi s dng cu lnh gotomt cc tng minh:
case1: DoAnything(); gotocase2; case2:
Do vy khi thc hin xong cc cu lnh ca mt trng hp nu mun thc hin mt trng hp casekhc th ta dng cu lnh nhy gotovi nhn ca trng hp :
gotocase<gitr>
Khi gp lnh thot breakth chng trnh thot khi switchv thc hin lnh tip sau khi
switch.
Nu khng c trng hp no thch hp v trong cu lnh switchc dng cu lnh defalut th cc cu lnh ca trng hp defaults c thc hin. Ta c th dng default cnh bo mt li hay x l mt trng hp ngoi tt c cc trng hp casetrong switch. Trong v d minh ha cu lnh switchtrc th gi tr kim tra cc trng hp thch hp l cc hng s nguyn. Tuy nhin C# cn c kh nng cho php chng ta dng cu lnh
switchvi { casemaudo:
switch(chuoi1)
Cu lnh lp
C# cung cp mt b m rng cc cu lnh lp, bao gm cc cu lnh lp for, while v do... while. Ngoi ra ngn ng C# cn b sung thm mt cu lnh lp foreach, lnh ny mi i vi ngi lp trnh C/C++ nhng kh thn thin vi ngi lp trnh VB. Cui cng l cc cu lnh nhy nh goto, break,continue, v return. Cu lnh nhy goto Lnh nhy gotol mt lnh nhy n gin, cho php chng trnh nhy v iu kin ti mt v tr trong chng trnh thng qua tn nhn. Tuy nhin vic s dng lnh goto thng lm mt i tnh cu trc thut ton, vic lm dng s dn n mt chng trnh ngun m gii lp trnh gi l m n lin ri nh m bng bong vy. Hu ht cc ngi lp trnh c kinh nghim u trnh dng lnh goto. Sau y l cch s dng lnh nhy goto: To mt nhn
goton
nhn
Nhn l mt nh danh theo sau bi du hai chm (:). Thng thng mt lnh goto gn vi mt iu kin no , v d 3.10 sau s minh ha cc s dng lnh nhy goto trong chng trnh. V d 3.10: S dng goto. ----------------------------------------------------------------------------usingSystem; publicclassUsingGoto { publicstaticintMain() { inti=0; lap: //nhn
} }
-----------------------------------------------------------------------------
Kt qu:
i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9
----------------------------------------------------------------------------Nu chng ta v lu ca mt chng trnh c s dng nhiu lnh goto, th ta s thy kt qu rt nhiu ng chng cho ln nhau, ging nh l cc si m vy. Chnh v vy nn nhng on m chng trnh c dng lnh goto cn c gi l spaghetti code. Vic trnh dng lnh nhy goto trong chng trnh hon ton thc hin c, c th dng vng lp while thay th hon ton cc cu lnh goto. Vng lp while ngha ca vng lp whilel: Trong khi iu kin ng th thc hin cc cng vic ny. C php s dng vng lp whilenh sau:
while(Biuthc) <Culnhthchin>
Biu thc ca vng lp while l iu kin cc lnh c thc hin, biu thc ny bt buc phi tr v mt gi tr kiu bool l true/false. Nu c nhiu cu lnh cn c thc hin trong vng lp while th phi t cc lnh ny trong khi lnh. V d 3.11 minh ha vic s dng vng lp while. V d 3.11: S dng vng lp while. ----------------------------------------------------------------------------usingSystem; publicclassUsingWhile { publicstaticintMain() { inti=0; while(i<10)
{ Console.WriteLine(i:{0},i); i++;
} return0; } }
----------------------------------------------------------------------------Kt qu:
i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9
----------------------------------------------------------------------------on chng trnh 3.11 cng cho kt qu tng t nh chng trnh minh ha 3.10 dng lnh goto. Tuy nhin chng trnh 3.11 r rng hn v c ngha t nhin hn. C th din gii ngn ng t nhin on vng lp while nh sau: Trong khi i nh hn 10, th in ra gi tr ca i v tng i ln mt n v. Lu rng vng lp while s kim tra iu kin trc khi thc hin cc lnh bn trong, iu ny m bo nu ngay t u iu kin sai th vng lp s khng bao gi thc hin. do vy nu khi to bin ic gi tr l 11, th vng lp s khng c thc hin. Vng lp do...while i khi vng lp whilekhng tho mn yu cu trong tnh hung sau, chng ta mun chuyn ng ngha ca whilel chy trong khi iu kin ng thnh ng ngha khc nh lm iu ny trong khi iu kin vn cn ng. Ni cch khc thc hin mt hnh ng, v sau khi hnh ng c hon thnh th kim tra iu kin. C php s dng vng lp do...whilenh sau:
do <Culnhthchin> while(iukin)
y c s khc bit quan trng gia vng lp while v vng lp do...while l khi dng vng lp do...while th ti thiu s c mt ln cc cu lnh trong do...while c thc hin. iu ny cng d hiu v ln u tin i vo vng lp do...while th iu kin
----------------------------------------------------------------------------Kt qu:
i: 11
----------------------------------------------------------------------------Do khi to bin igi tr l 11, nn iu kin ca whilel sai, tuy nhin vng lp do...while vn c thc hin mt ln. Vng lp for Vng lp forbao gm ba phn chnh: Khi to bin m vng lp Kim tra iu kin bin m, nu ng th s thc hin cc lnh bn trong vng for Thay i bc lp.
Vng lp forc minh ha trong v d sau: V d 3.13: S dng vng lp for. ----------------------------------------------------------------------------usingSystem; publicclassUsingFor { publicstaticintMain()
{ for(inti=0;i<30;i++)
----------------------------------------------------------------------------Kt qu:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
----------------------------------------------------------------------------Trong on chng trnh trn c s dng ton t chia ly d modulo, ton t ny s c cp n phn sau. ngha lnh i%10 ==0 l kim tra xem i c phi l bi s ca 10 khng, nu i l bi s ca 10 th s dng lnh WriteLine xut gi tr i v sau a cursor v u dng sau. Cn ngc li ch cn xut gi tr ca iv khng xung dng. u tin bin i c khi to gi tr ban u l 0, sau chng trnh s kim tra iu kin, do 0 nh hn 30 nn iu kin ng, khi cc cu lnh bn trong vng lp fors c thc hin. Sau khi thc hin xong th bin is c tng thm mt n v (i++). C mt iu lu l bin i do khai bao bn trong vng lp fornn ch c phm vi hot ng bn trong vng lp. V d 3.14 sau s khng c bin dch v xut hin mt li. V d 3.14: Phm vi ca bin khai bo trong vng lp. ----------------------------------------------------------------------------usingSystem; publicclassUsingFor { publicstaticintMain() {
for(inti=0;i<30;i++) {
----------------------------------------------------------------------------Cu lnh lp foreach Vng lp foreachcho php to vng lp thng qua mt tp hp hay mt mng. y l mt cu lnh lp mi khng c trong ngn ng C/C++. Cu lnh foreach c c php chung nh sau:
foreach(<kiutphp><tntruycpthnhphn>in<tntphp>) <Ccculnhthchin>
Do lp da trn mt mng hay tp hp nn ton b vng lp s duyt qua tt c cc thnh phn ca tp hp theo th t c sp. Khi duyt n phn t cui cng trong tp hp th chng trnh s thot ra khi vng lp foreach. V d 3.15 minh ha vic s dng vng lp foreach. ----------------------------------------------------------------------------usingSystem; publicclassUsingForeach { publicstaticintMain() { int[]intArray={1,2,3,4,5,6,7,8,9,10}; foreach(intiteminintArray) { Console.Write({0},item); }
return0; }
----------------------------------------------------------------------------Kt qu:
1 2 3 4 5 6 7 8 9 10
----------------------------------------------------------------------------Cu lnh nhy breakv continue Khi ang thc hin cc lnh trong vng lp, c yu cu nh sau: khng thc hin cc lnh cn li na m thot khi vng lp, hay khng thc hin cc cng vic cn li ca vng lp hin ti m nhy qua vng lp tip theo. p ng yu cu trn C# cung cp hai lnh nhy l breakv continue thot khi vng lp.
Break khi
c s dng s a chng trnh thot khi vng lp v tip tc thc hin thc hin cc cng vic cn li ca vng lp hin thi v quay v u vng
lp thc hin bc lp tip theo Hai lnh breakv continueto ra nhiu im thot v lm cho chng trnh kh hiu cng nh l kh duy tr. Do vy phi cn trng khi s dng cc lnh nhy ny. V d 3.16 s c trnh by bn di minh ha cch s dng lnh continue v
break.
c mt chui k t t bn phm.
Thut ton ca chng trnh kh n gin: Khi nhn tn hiu 0 c ngha l mi vic bnh thng, khng cn phi lm bt c cng vic g c, k c vic ghi li cc s kin. Trong chng trnh ny n gin nn cc tn hiu c nhp t bn phm, cn trong ng dng tht th tn hiu ny s c pht sinh theo cc mu tin thi gian trong c s d liu. Khi nhn c tn hiu thot (m phng bi k t T) th ghi li tnh trng v kt thc x l. Cui cng, bt c tn hiu no khc s pht ra mt thng bo, c th l thng bo n nhn vin cnh st chng hn...Trng hp tn hiu l X th cng s pht ra mt thng bo nhng sau vng lp x l cng kt thc. V d 3.16: S dng breakv continue. ----------------------------------------------------------------------------usingSystem; publicclassTrafficSignal {
{ //nhptnhiu Console.Write(Nhapvaomottinhieu:); signal=Console.ReadLine(); //xuttnhiuhinthi Console.WriteLine(Tinhieunhanduoc:{0},signal); //phnxltnhiuif (signal==T) { //Tnhiuthotcgi //luliskinvthotConsole.WriteLine(Ngung xuly!Thoat\n);break; } if(signal==0) { //Tnhiunhncbnhthng //Luliskinvtiptc Console.WriteLine(Tatcadieutot!\n); continue; } //Thchinmtshnhngno //vtiptc Console.WriteLine(bipbipbip\n); } return0; } }
Nhap vao mot tin hieu: T Tin hieu nhan duoc: T Ngung xu ly! Thoat
----------------------------------------------------------------------------im chnh yu ca on chng trnh trn l khi nhp vo tn hiu T th sau khi thc hin mt s hnh ng cn thit chng trnh s thot ra khi vng lp v khng xut ra cu thng bo bip bip bip. Ngc li khi nhn c tn hiu 0 th sau khi xut thng bo chng trnh s quay v u vng lp thc hin tip tc v cng khng xut ra cu thng bo bip bip bip.
Ton t
Ton t c k hiu bng mt biu tng dng thc hin mt hnh ng. Cc kiu d liu c bn ca C# nh kiu nguyn h tr rt nhiu cc ton t nh ton t gn, ton t ton hc, logic....
Ton t gn
n lc ny ton t gn kh quen thuc vi chng ta, hu ht cc chng trnh minh ha t u sch u s dng php gn. Ton t gn hay php gn lm cho ton hng bn tri thay i gi tr bng vi gi tr ca ton hng bn phi. Ton t gn l ton t hai ngi. y l ton t n gin nht thng dng nht v cng d s dng nht.
Ton t ton hc
Ngn ng C# cung cp nm ton t ton hc, bao gm bn ton t u cc php ton c bn. Ton t cui cng l ton t chia nguyn ly phn d. Chng ta s tm hiu chi tit cc php ton ny trong phn tip sau. Cc php ton s hc c bn (+,-,*,/) Cc php ton ny khng th thiu trong bt c ngn ng lp trnh no, C# cng khng ngoi l, cc php ton s hc n gin nhng rt cn thit bao gm: php cng (+), php tr (-), php nhn (*), php chia (/) nguyn v khng nguyn. Khi chia hai s nguyn, th C# s b phn phn s, hay b phn d, tc l nu ta chia 8/3 th s c kt qu l 2 v s b phn d l 2, do vy ly c phn d ny th C# cung cp thm ton t ly d s c trnh by trong phn k tip. Tuy nhin, khi chia cho s thc c kiu nh float, double, hay decimalth kt qu chia c tr v l mt s thc. Php ton chia ly d tm phn d ca php chia nguyn, chng ta s dng ton t chia ly d (%). V d, cu lnh sau 8%3th kt qu tr v l 2 (y l phn d cn li ca php chia nguyn). Tht s php ton chia ly d rt hu dng cho ngi lp trnh . Khi chng ta thc hin
mt php chia d n cho mt s khc, nu s ny l bi s ca n th kt qu ca php chia d l 0. V d 20 % 5 = 0 v 20 l mt bi s ca 5. iu ny cho php chng ta ng dng trong
vng lp, khi mun thc hin mt cng vic no cch khong n ln, ta ch cn kim tra php chia d n, nu kt qu bng 0 th thc hin cng vic. Cch s dng ny p dng trong v d minh ha s dng vng lp for bn trn. V d 3.17 sau minh ha s dng cc php ton chia trn cc s nguyn, thc... V d 3.17: Php chia v php chia ly d. ----------------------------------------------------------------------------usingSystem; classTester { publicstaticvoidMain() { inti1,i2; floatf1,f2; doubled1,d2; decimaldec1,dec2; i1=17; i2=4; f1 = 17f; f2 = 4f; d1 = 17; d2=4; dec1=17; dec2=4; Console.WriteLine(Integer:\t{0},i1/i2); Console.WriteLine(Float:\t{0},f1/f2); Console.WriteLine(Double:\t{0},d1/d2); Console.WriteLine(Decimal:\t{0},dec1/dec2); Console.WriteLine(\nModulus::\t{0},i1%i2); } }
----------------------------------------------------------------------------Kt qu:
Integer: 4 float: 4.25
double:
4.25
decimal: 4.25
Modulus: 1
-----------------------------------------------------------------------------
Trong cu lnh trn php cng c thc hin trc, khi kt qu ca v phi l 1.700.000 v kt qu ny s c gn li cho bin Luong, cui cng Luong c gi tr l 1.700.000. Chng ta c th thc hin vic thay i gi tr ri gn li cho bin vi bt k php ton s hc no:
Luong=Luong*2; Luong=Luong100.000; ...
Do vic tng hay gim gi tr ca mt bin rt thng xy ra trong khi tnh ton nn C# cung cp cc php ton t gn (self- assignment). Bng sau lit k cc php ton t gn. Ton t
+= =
ngha Cng thm gi tr ton hng bn phi vo gi tr ton hng bn tri bt i mt Ton hng bn tri c tr lng bng gi tr ca ton hng bn Ton hng bn tri c nhn vi mt lng bng gi tr ca ton hng bn Ton hng bn tri c chia vi mt lng bng gi tr ca ton hng bn Ton hng bn tri c chia ly d vi mt lng bng gi tr ca ton hng
*=
/=
%=
Da trn cc php ton t gn trong bng ta c th thay th cc lnh tng gim lng nh sau:
Kt qu ca lnh th nht l gi tr ca Luong s tng thm 200.000, lnh th hai s lm cho gi tr Luongnhn i tc l tng gp 2 ln, v lnh cui cng s tr bt 100.000 ca Luong. Do vic tng hay gim 1 rt ph bin trong lp trnh nn C# cung cp hai ton t c bit l tng mt (++) hay gim mt (--). Khi mun tng i mt gi tr ca bin m trong vng lp ta c th vit nh sau:
bienDem++;
Ton t tng gim tin t v tng gim hu t Gi s mun kt hp cc php ton nh gia tng gi tr ca mt bin v gn gi tr ca bin cho bin th hai, ta vit nh sau:
var1=var2++;
Cu hi c t ra l gn gi tr trc khi cng hay gn gi tr sau khi cng. Hay ni cch khc gi tr ban u ca bin var2 l 10, sau khi thc hin ta mun gi tr ca var1 l 10, var2l 11, hay var1l 11, var2cng 11? gii quyt yu cu trn C# cung cp th t thc hin php ton tng/gim vi php ton gn, th t ny c gi l tin t (prefix) hay hu t (postfix). Do ta c th vit:
var1=var2++;//Hut
Khi lnh ny c thc hin th php gn s c thc hin trc tin, sau mi n php ton tng. Kt qu l var1= 10 v var2= 11. Cn i vi trng hp tin t:
var1=++var2;
Khi php tng s c thc hin trc tc l gi tr ca bin var2 s l 11 v cui cng php gn c thc hin. Kt qu c hai bin var1v var2iu c gi tr l 11. hiu r hn v hai php ton ny chng ta s xem v d minh ha 3.18 sau V d 3.18: Minh ho s dng ton t tng trc v tng sau khi gn. ----------------------------------------------------------------------------usingSystem; classTester { staticintMain() { intvalueOne=10; intvalueTwo; valueTwo=valueOne++;
----------------------------------------------------------------------------Kt qu:
Thuc hien tang sau: 11, 10 Thuc hien tang truoc: 21, 21
-----------------------------------------------------------------------------
Ton t quan h
Nhng ton t quan h c dng so snh gia hai gi tr, v sau tr v kt qu l mt gi tr logic kiu bool(truehay false). V d ton t so snh ln hn (>) tr v gi tr l true nu gi tr bn tri ca ton t ln hn gi tr bn phi ca ton t. Do vy 5>2tr v mt gi tr l true, trong khi 2>5tr v gi tr false. Cc ton t quan h trong ngn ng C# c trnh by bng 3.4 bn di. Cc ton t trong bng c minh ha vi hai bin l value1 v value2, trong value1 c gi tr l 100 v value2c gi tr l 50. Tn ton t So snh bng Khng bng Ln hn Ln hn hay bng Nh hn Nh hn hay bng K hiu
== != > >= < <=
Kt qu so snh
true false false true true false true false true false
Bng 3.4: Cc ton t so snh (gi s value1 = 100, v value2 = 50). Nh trong bng 3.4 trn ta lu ton t so snh bng (==), ton t ny c k hiu bi hai du bng (=) lin nhau v cng trn mt hng , khng c bt k khong trng no xut hin gia chng. Trnh bin dch C# xem hai du ny nh mt ton t.
Ton t logic
Trong cu lnh if m chng ta tm hiu trong phn trc, th khi iu kin l true th biu thc bn trong ifmi c thc hin. i khi chng ta mun kt hp nhiu iu kin vi nhau nh: bt buc c hai hay nhiu iu kin phi ng hoc ch cn mt trong cc iu kin ng l hoc khng c iu kin no ng...C# cung cp mt tp hp cc ton t logic phc v cho ngi lp trnh. Bng 3.5 lit k ba php ton logic, bng ny cng s dng hai bin minh ha l x, v ytrong xc gi tr l 5 v yc gi tr l 7. Tn ton t
and or not
K hiu
&& || ! 7)
Gi tr
false true true
Logic C hai iu kin phi ng Ch cn mt iu kin ng Biu thc trong ngoc phi sai.
Bng 3.5: Cc ton t logic (gi s x=5,y=7). Ton t ands kim tra c hai iu kin. Trong bng 3.5 trn c minh ha biu thc logic s dng ton t and:
(x==3)&&(y==7)
Ton b biu thc c xc nh l sai v c iu kin (x==3) l sai. Vi ton t or, th mt hay c hai iu kin ng th ng, biu thc s c gi tr l sai khi c hai iu kin sai. Do vy ta xem biu thc minh ha ton t or:
(x==3)||(y==7)
Biu thc ny c xc nh gi tr l ng do c mt iu kin ng l (y==7) l ng. i vi ton t not, biu thc s c gi tr ng khi iu kin trong ngoc l sai, v ngc li, do biu thc:
!(x==3)
c gi tr l ng v iu kin trong ngoc tc l (x==3) l sai. Nh chng ta bit i vi php ton logic andth ch cn mt iu kin trong biu thc sai l ton b biu thc l sai, do vy tht l d tha khi kim tra cc iu kin cn li mt khi c mt iu kin sai. Gi s ta c on chng trnh sau:
intx=8; if((x==5)&&(y==10))
Khi biu thc if s ng khi c hai biu thc con l (x == 5) v (y == 10) ng. Tuy nhin khi xt biu thc th nht do gi tr xl 8 nn biu thc (x==5) l sai. Khi khng
Tng t vi biu thc logic or, khi xc nh c mt biu thc con ng th khng cn phi xc nh cc biu thc con cn li, v ton t logic orch cn mt iu kin ng l :
intx=8; if((x==8)||(y==10))
Khi kim tra biu thc (x == 8) c gi tr l ng, th khng cn phi xc nh gi tr ca biu thc (y==10) na. Ngn ng lp trnh C# s dng logic nh chng ta tho lun bn trn loi b cc tnh ton so snh d tha v cng khng logic na!
u tin ton t
Trnh bin dch phi xc nh th t thc hin cc ton t trong trng hp mt biu thc c nhiu php ton, gi s, c biu thc sau:
var1=5+7*3;
Biu thc trn c ba php ton thc hin bao gm (=, +,*). Ta th xt cc php ton theo th t t tri sang phi, u tin l gn gi tr 5 cho bin var1, sau cng 7 vo 5 l 12 cui cng l nhn vi 3, kt qu tr v l 36, iu ny tht s c vn , khng ng vi mc ch yu cu ca chng ta. Do vy vic xy dng mt trnh t x l cc ton t l ht sc cn thit. Cc lut v u tin x l s bo trnh bin dch bit c ton t no c thc hin trc trong biu thc.Tng t nh trong php ton i s th php nhn c u tin thc hin trc php ton cng, do vy 5+7*3cho kt qu l 26ng hn kt qu 36. V c hai php ton cng v php ton nhn iu c u tin cao hn php gn. Nh vy trnh bin dch s thc hin cc php ton ri sau thc hin php gn bc cui cng. Kt qu ng ca cu lnh trn l bin var1s nhn gi tr l 26. Trong ngn ng C#, du ngoc c s dng thay i th t x l, iu ny cng ging trong tnh ton i s. Khi mun kt qu 36cho bin var1c th vit:
var1=(5+7)*3;
Biu thc trong ngoc s c x l trc v sau khi c kt qu l 12 th php nhn c thc hin. Bng 3.6: Lit k th t u tin cc php ton trong C#. STT 1 2 3 4 5 Loi ton t Php ton c bn Ton t
(x) x.y f(x) a[x] x++ xnew typeof sizeofcheckedunchecked +!~++xx(T)x
*/% + <<>>
Quan h
<><=>=is
Tri
7 8 9 10 11 12 13 14
So snh bng ==!= Php ton logic & AND Php ton logic ^ XOR Php ton logic OR iu kin AND iu kin OR iu kin Php gn
| && || ?: =*=/=%=+==<<=>>= &= ^=|=
Bng 3.6: Th t u tin cc ton t. Cc php ton c lit k cng loi s c th t theo mc th th ca bng: th t tri tc l u tin ca cc php ton t bn tri sang, th t phi th cc php ton c u tin t bn phi qua tri. Cc ton t khc loi th c u tin t trn xung di, do vy cc ton t loi c bn s c u tin cao nht v php ton gn s c u tin thp nht trong cc ton t.
Ton t ba ngi
Hu ht cc ton t i hi c mt ton hng nh ton t (++, --) hay hai ton hng nh (+,-,*,/,...). Tuy nhin, C# cn cung cp thm mt ton t c ba ton hng (?:). Ton t ny c c php s dng nh sau:
<Biuthciukin>?<Biuthcth1>:<Biuthcth2>
Ton t ny s xc nh gi tr ca mt biu thc iu kin, v biu thc iu kin ny phi tr v mt gi tr kiu bool. Khi iu kin ng th <biu thc th 1> s c thc hin, cn ngc li iu kin sai th <biu thc th 2> s c thc hin. C th din gii theo ngn ng t nhin th ton t ny c ngha : Nu iu kin ng th lm cng vic th nht, cn ngc li iu kin sai th lm cng vic th hai. Cch s dng ton t ba ngi ny c minh ha trong v d 3.19 sau. V d 3.19: S dng ton t bao ngi. ----------------------------------------------------------------------------usingSystem; classTester { publicstaticintMain() {
intvalue1;
----------------------------------------------------------------------------Kt qu:
Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20
----------------------------------------------------------------------------Trong v d minh ha trn ton t ba ngi c s dng kim tra xem gi tr ca value1 c ln hn gi tr ca value2, nu ng th tr v gi tr ca value1, tc l gn gi tr value1 cho bin maxValue, cn ngc li th gn gi tr value2cho bin maxValue.
Namespace
Chng 2 tho lun vic s dng c tnh namespace trong ngn ng C#, nhm trnh s xung t gia vic s dng cc th vin khc nhau t cc nh cung cp. Ngoi ra, namespace c xem nh l tp hp cc lp i tng, v cung cp duy nht cc nh danh cho cc kiu d liu v c t trong mt cu trc phn cp. Vic s dng namespace trong khi lp trnh l mt thi quen tt, bi v cng vic ny chnh l cch lu cc m ngun s dng v sau. Ngoi th vin namespace do MS.NET v cc hng th ba cung cp, ta c th to ring cho mnh cc namespace. C# a ra t kha using khai bo s dng namespace trong chng trnh:
using<Tnnamespace>
----------------------------------------------------------------------------V d trn to ra mt namespace c tn l MyLib, bn trong namespace ny cha mt lp c tn l Tester. C# cho php trong mt namespace c th to mt namespace khc lng bn trong v khng gii hn mc phn cp ny, vic phn cp ny c minh ha trong v d 3.21. V d 3.21: To cc namespace lng nhau. ----------------------------------------------------------------------------namespaceMyLib { namespaceDemo { usingSystem; publicclassTester { publicstaticintMain() { for(inti=0;i<10;i++) { Console.WriteLine(i:{0},i); }
return0; } }
} }
Trong mt namespace mt lp c th gi mt lp khc thuc cc cp namespace khc nhau, v d tip sau minh ha vic gi mt hm thuc mt lp trong namespace khc. V d 3.22: Gi mt namespace thnh vin. ----------------------------------------------------------------------------usingSystem; namespaceMyLib { namespaceDemo1 { classExample1 { publicstaticvoidShow1() { Console.WriteLine(LopExample1); } } } namespaceDemo2 { publicclassTester { publicstaticintMain() { Demo1.Example1.Show1(); Demo1.Example2.Show2(); return0; } } }
} //LpExample2ccngnamespaceMyLib.Demo1vi
----------------------------------------------------------------------------Kt qu:
Lop Exemple1 Lop Exemple2
----------------------------------------------------------------------------V d 3.22 trn c hai im cn lu l cch gi mt namespace thnh vin v cch khai bo cc namspace. Nh chng ta thy trong namespace MyLibc hai namespace con cng cp l
Demo1v Demo2, Demo1.
c gi hai hm thnh vin tnh ca hai lp Example1v Example2ca namespace V d trn cng a ra cch khai bo khc cc lp trong namespace. Hai lp Example1 v
Example2 iu
Vic khai bo ring l ny c th cho php trn nhiu tp tin ngun khc nhau, min sao m bo khai bo ng tn namspace th chng vn thuc v cng mt namespace.
Cc ch dn bin dch
i vi cc v d minh ha trong cc phn trc, khi bin dch th ton b chng trnh s c bin dch. Tuy nhin, c yu cu thc t l chng ta ch mun mt phn trong
chng trnh c bin dch c lp, v d nh khi debug chng trnh hoc xy dng cc ng dng... Trc khi mt m ngun c bin dch, mt chng trnh khc c gi l chng trnh tin x l s thc hin trc v chun b cc on m ngun bin dch. Chng trnh tin x l ny s tm trong m ngun cc k hiu ch dn bin dch c bit, tt c cc ch dn bin dch ny u c bt u vi du ro (#). Cc ch dn cho php chng ta nh ngha cc nh danh v kim tra cc s tn ti ca cc nh danh .
nh ngha nh danh
Cu lnh tin x l sau:
#defineDEBUG
Lnh trn nh ngha mt nh danh tin x l c tn l DEBUG. Mc d nhng ch th tin x l khc c th c t bt c u trong chng trnh, nhng vi ch th nh ngha nh danh th phi t trc tt c cc lnh khc, bao gm c cu lnh using. kim tra mt nh danh c nh ngha th ta dng c php #if<nhdanh>. Do ta c th vit nh sau:
#defineDEBUG //...Cconmngunbnhthng,khngbtcngbitrnhtinxl ... #ifDEBUG //Cconmnguntrongkhiifdebugcbindch #else //Cconmngunkhngnhnghadebugvkhngcbindch #endif //...Cconmngunbnhthng,khngbtcngbitrnhtinxl
Khi chng trnh tin x l thc hin, chng s tm thy cu lnh #define DEBUG v lu li nh danh DEBUG ny. Tip theo trnh tin x l ny s b qua tt c cc on m bnh thng khc ca C# v tm cc khi #if, #else, v #endif. Cu lnh #ifs kim tra nh danh DEBUG, do nh danh ny c nh ngha, nn on m ngun gia khi #if n #else s c bin dch vo chng trnh. Cn on m ngun gia #else v #endif s khng c bin dch. Tc l on m ngun ny s khng c thc hin hay xut hin bn trong m hp ng ca chng trnh. Trng hp cu lnh #if sai tc l khng c nh ngha mt nh danh DEBUG trong chng trnh, khi on m ngun gia khi #if v #else s khng c a vo chng trnh bin dch m ngc li on m ngun gia khi #else v #endif s
c bin dch. Lu : Tt c cc on m ngun bn ngoi #ifv #endifth khng b tc ng bi trnh tin x l v tt c cc m ny u c a vo bin dch.
tin ng do DEBUG c nh ngha, cn #if th hai sai khng c bin dch v nh ngha li l #undef.
DEBUG c
Ngoi ra cn c ch th #elif v #elsecung cp cc ch dn phc tp hn. Ch dn #elif cho php s dng logic elseif. Ta c th din gii mt ch dn nh sau: Nu DEBUG th lm cng vic 1, ngc li nu TEST th lm cng vic 2, nu sai tt c th lm trng hp 3:
.... #ifDEBUG //oncodenycbindchnuDEBUGcnhngha #elifTEST //oncodenycbindchnuDEBUGkhngcnhngha //vTESTcnhngha #else //oncodenycbindchnucDEBUGv //TESTkhngcnhngha. #endif ....
danh DEBUG c nh ngha th on m ngun gia #ifv #elifs c bin dch, v tt c cc phn cn li cho n ch th #endifu khng c bin dch. Nu DEBUGkhng c nh ngha th #elifs kim tra nh danh TEST, on m gia #elifv #elses c
thc thi khi TEST c nh ngha. Cui cng nu c hai DEBUG v TEST u khng c nh ngha th cc on m ngun gia #elsev #endifs c bin dch.
Cu hi v tr li
Cu hi 1: S khc nhau gia da trn thnh phn (Component-Based) v hng i tng (Object- Oriented)? Tr li 1: Pht trin da trn thnh phn c th c xem nh l m rng ca lp trnh hng i tng. Mt thnh phn l mt khi m ngun ring c th thc hin mt nhim v c bit. Lp trnh da trn thnh phn bao gm vic to nhiu cc thnh phn t hot ng c th c dng li. Sau chng ta c th lin kt chng li xy dng cc ng dng. Cuhi 2: Nhng ngn ng no khc c xem nh l hng i tng? Tr li 2: Cc ngn ng nh l C++, Java, SmallTalk, Visual Basic.NET cng c th c s dng cho lp trnh hng i tng. Cn rt nhiu nhng ngn ng khc nhng khng c ph bin lm. Cu hi 3: Ti sao trong kiu s khng nn khai bo kiu d liu ln thay v dng kiu d liu nh hn? Tr li 3: Mc d iu c th xem l kh hp l, nhng tht s khng hiu qu lm. Chng ta khng nn s dng nhiu ti nguyn b nh hn mc cn thit. Khi va lng ph b nh li va hn ch tc ca chng trnh. Cuhi 4: Chuyn g xy ra nu ta gn gi tr m vo bin kiu khng du? Tr li 4: Chng ta s nhn c li ca trnh bin dch ni rng khng th gn gi tr m cho bin khng du trong trng hp ta gn gi tr hng m. Cn nu trong trng hp kt qu l m c tnh trong biu thc khi chy chng trnh th chng ta s nhn c li d liu. Vic kim tra v x l li d liu s c trnh by trong cc phn sau. Cu hi 5: Nhng ngn ng no khc h tr Common Type System (CTS) trong Common Language Runtime (CLR)? Tr li 5: Microsoft Visual Basic (Version 7), Visual C++.NET cng h tr CTS. Thm vo l mt s phin bn ca ngn ng khc cng c chuyn vo CTS. Bao gm Python, COBOL, Perl, Java. Chng ta c th xem trn trang web ca Microsoft bit thm chi tit. Cuhi 6: C phi cn nhng cu lnh iu khin khc? Tr li 6: ng, cc cu lnh ny nh sau: throw, try, catch v finally. Chng ta s c hc trong chng x l ngoi l. Cuhi 7: C th s dng chui vi cu lnh switch? Tr li 7: Hon ton c, chng ta s dng bin gi tr chui trong switch ri sau dng gi tr chui trong cu lnh case. Lu l chui l nhng k t n gin nm gia hai du ngoc nhy.
Cu hi thm
Cuhi 1: C bao nhiu cch khai bo comment trong ngn ng C#, cho bit chi tit?
Cu hi 2: Nhng t theo sau t no l t kha trong C#: field, cast, as, object, throw, football, do, get, set, basketball. Cuhi 3: Nhng khi nim chnh ca ngn ng lp trnh hng i tng? Cuhi 4: S khc nhau gia hai lnh Write v WriteLine? Cu hi 5: C# chia lm my kiu d liu chnh? Nu ta to mt lp tn myClass th lp ny c xp vo kiu d liu no? Cuhi 6: Kiu chui trong C# l kiu d liu no? Cuhi 7: D liu ca bin kiu d liu tham chiu c lu u trong b nh? Cu hi 8: S khc nhau gia lp v cu trc trong C#? Khi no th dng cu trc tt hn l dng class? Cuhi 8: S khc nhau gia kiu unsigned v signed trong kiu s nguyn? Cuhi 9: Kiu d liu no nh nht c th lu tr c gi tr 45? Cuhi 10: S ln nht, v nh nht ca kiu intl s no? Cuhi 11: C bao nhiu bit trong mt byte? Cuhi 12: Kiu d liu no trong .NET tng ng vi kiu inttrong C#? Cuhi 13: Nhng t kha no lm thay i lung ca chng trnh? Cuhi 14: Kt qu ca 15%4 l bao nhiu? Cuhi 15: S khc nhau gia chuyn i tng minh v chuyn i ngm nh? Cuhi 16: C th chuyn t mt gi tr long sang gi tr inthay khng? Cuhi 17: S ln ti thiu cc lnh trong whilec thc hin? Cuhi 18: S ln ti thiu cc lnh trong do whilec thc hin? Cuhi 19: Lnh no dng thot ra khi vng lp? Cuhi 20: Lnh no dng qua vng lp k tip? Cuhi 21: Khi no dng bin v khi no dng hng? Cuhi 22: Cho bit gi tr CanhCut trong kiu lit k sau:
enumLoaiChim { HaiAu, BoiCa, DaiBang=50, CanhCut }
Bi tp
Bi tp 1: Nhp vo, bin dch v chy chng trnh. Hy cho bit chng trnh lm iu g? -----------------------------------------------------------------------------
----------------------------------------------------------------------------Bi tp2: Tm li ca chng trnh sau? sa li v bin dch chng trnh. ----------------------------------------------------------------------------classBaiTap3_2 { publicstaticvoidMain() { for(inti=0;i<10;i++) System.Console.WriteLine(so:{1},i); } }
----------------------------------------------------------------------------Bi tp3: Tm li ca chng trnh sau. Sa li v bin dch li chng trnh. ----------------------------------------------------------------------------usingSystem; classBaiTap3_3 { publicstaticvoidMain() { doublemyDouble; decimalmyDecimal; myDouble=3.14; myDecimal=3.14; Console.WriteLine(MyDouble:{0},myDouble);
Console.WriteLine(MyDecimal:{0},myDecimal); } }
----------------------------------------------------------------------------Bi tp4: Tm li ca chng trnh sau. Sa li v bin dch li chng trnh. ----------------------------------------------------------------------------classBaiTap3_4 { staticvoidMain() { intvalue; if(value>100); System.Console.WriteLine(Numberisgreaterthan100); } }
----------------------------------------------------------------------------Bi tp5: Vit chng trnh hin th ra mn hnh 3 kiu sau: * ** *** **** ***** ****** a) $$$$$$ $$$$$ $$$$ $$$ $$ $ b) * *** ***** ******* ********* *********** c)
1 232 34543 4567654 567898765 67890109876 7890123210987 890123454321098 90123456765432109 0123456789876543210 Bi tp 7: Vit chng trnh in k t s (0..9) v k t ch (a..z) vi m k t tng ng ca tng k t V d: 0 : 48 1 : 49 .... Bi tp 8: Vit chng trnh gii phng trnh bc nht, cho php ngi dng nhp vo gi tr a, b. Bi tp9: Vit chng trnh gii phng trnh bc hai, cho php ngi dng nhp vo gi tr a, b, c. Bi tp 10: Vit chng trnh tnh chu vi v din tch ca cc hnh sau: ng trn, hnh ch nht, hnh thang, tam gic.
Chng 4
XY DNG LP - I TNG
nh ngha lp
Thuc tnh truy cp Tham s ca phng thc
To i tng
B khi dng Khi to bin thnh vin B khi dng sao chp T kha this
Hy i tng Truyn tham s Np chng phng thc ng gi d liu vi thnh phn thuc tnh Thuc tnh ch c Cu hi & bi tp
Chng 3 tho lun rt nhiu kiu d liu c bn ca ngn ng C#, nh int, longand char. Tuy nhin tri tim v linh hn ca C# l kh nng to ra nhng kiu d liu mi, phc 155
Xy Dng Lp - i Tng
tp. Ngi lp trnh to ra cc kiu d liu mi bng cch xy dng cc lp i tng v cng chnh l cc vn chng ta cn tho lun trong chng ny. y l kh nng to ra nhng kiu d liu mi, mt c tnh quan trng ca ngn ng lp trnh hng i tng. Chng ta c th xy dng nhng kiu d liu mi trong ngn ng C# bng cch khai bo v nh ngha nhng lp. Ngoi ra ta cng c th nh ngha cc kiu d liu vi nhng giao din (interface) s c bn trong Chng 8 sau. Th hin ca mt lp c gi l nhng i tng (object). Nhng i tng ny c to trong b nh khi chng trnh c thc hin. S khc nhau gia mt lp v mt i tng cng ging nh s khc nhau gia khi nim gia loi mo v mt con mo Mun ang nm bn chn ca ta. Chng ta khng th ng chm hay a gin vi khi nim mo nhng c th thc hin iu c vi mo Mun, n l mt thc th sng ng, ch khng tru tng nh khi nim h loi mo. Mt h mo m t nhng con mo c cc c tnh: c trng lng, c chiu cao, mu mt, mu lng,...chng cng c hnh ng nh l n ng, leo tro,...mt con mo, v d nh mo Mun chng hn, n cng c trng lng xc nh l 5 kg, chiu cao 15 cm, mu mt en, lng en...N cng c nhng kh nng nh n ng leo tro,.. Li ch to ln ca nhng lp trong ngn ng lp trnh l kh nng ng gi cc thuc tnh v tnh cht ca mt thc th trong mt khi n, t c ngha, t kh nng duy tr . V d khi chng ta mun sp ni dung nhng th hin hay i tng ca lp iu khin ListBox trn Windows, ch cn gi cc i tng ny th chng s t sp xp, cn vic chng lm ra sao th ta khng quan tm, v cng ch cn bit by nhiu thi. ng gi cng vi a hnh (polymorphism) v k tha (inheritance) l cc thuc tnh chnh yu ca bt k mt ngn ng lp trnh hng i tng no. Chng 4 ny s trnh by cc c tnh ca ngn ng lp trnh C# xy dng cc lp i tng. Thnh phn ca mt lp, cc hnh vi v cc thuc tnh, c xem nh l thnh vin ca lp (class member). Tip theo chng cng trnh ny khi nim v phng thc (method) c dng nh ngha hnh vi ca mt lp, v trng thi ca cc bin thnh vin hot ng trong mt lp. Mt c tnh mi m ngn ng C# a ra xy dng lp l khi nim thuc tnh (property), thnh phn thuc tnh ny hot ng ging nh cch phng thc to mt lp, nhng bn cht ca phng thc ny l to mt lp giao din cho bn ngoi tng tc vi bin thnh vin mt cch gin tip, ta s bn su vn ny trong chng. 156
Xy Dng Lp - i Tng
nh ngha lp
nh ngha mt kiu d liu mi hay mt lp u tin phi khai bo ri sau mi nh ngha cc thuc tnh v phng thc ca kiu d liu . Khai bo mt lp bng cch s dng t kho class. C php y ca khai bo mt lp nh sau:
[Thuctnh][Bsungtruycp]class<nhdanhlp>[:Lpcs] {
157
Xy Dng Lp - i Tng
<Phnthncalp:baogmnhnghaccthuctnhv phngthchnhng> }
Thnh phn thuc tnh ca i tng s c trnh by chi tit trong chng sau, cn thnh phn b sung truy cp cng s c trnh by tip ngay mc di. nh danh lp chnh l tn ca lp do ngi xy dng chng trnh to ra. Lp c s l lp m i tng s k tha pht trin ta s bn sau. Tt c cc thnh vin ca lp c nh ngha bn trong thn ca lp, phn thn ny s c bao bc bi hai du ({}). Ghi ch: Trong ngn ng C# phn kt thc ca lp khng c u chm phy ging nh khai bo lp trong ngn ng C/C++. Tuy nhin nu ngi lp trnh thm vo th trnh bin dch C# vn chp nhn m khng a ra cnh bo li. Trong C#, mi chuyn u xy ra trong mt lp. Nh cc v d m chng ta tm hiu trong chng 3, cc hm iu c a vo trong mt lp, k c hm u vo ca chng trnh (hm Main()):
publicclassTester { publicstaticintMain() { //.... } }
iu cn ni y l chng ta cha to bt c th hin no ca lp, tc l to i tng cho lp Tester. iu g khc nhau gia mt lp v th hin ca lp? tr li cho cu hi ny chng ta bt u xem xt s khc nhau gia kiu d liu int v mt bin kiu int . Ta c vit nh sau:
intvar1=10;
Ta khng th gn gi tr cho mt kiu d liu, thay vo ta ch c gn d liu cho mt i tng ca kiu d lu , trong trng hp trn i tng l bin var1. Khi chng ta to mt lp mi, chnh l vic nh ngha cc thuc tnh v hnh vi ca tt c cc i tng ca lp. Gi s chng ta ang lp trnh to cc iu khin trong cc ng dng trn Windows, cc iu khin ny gip cho ngi dng tng tc tt vi Windows, nh l ListBox, TextBox, ComboBox,...Mt trong nhng iu khin thng dng l ListBox, iu khin ny cung cp mt danh sch lit k cc mc chn v cho php ngi dng chn 158
Xy Dng Lp - i Tng
cc mc tin trong .
ListBox ny
cng c cc thuc tnh khc nhau nhu: chiu cao, b dy, v tr, v mu sc th
159
Xy Dng Lp - i Tng
Ngn ng lp trnh hng i tng cho php chng ta to kiu d liu mi l lp ListBox, lp ny bao bc cc thuc tnh cng nh kh nng nh: cc thuc tnh height, width,
location, color,
Chng ta khng th gn d liu cho kiu ListBox, thay vo u tin ta phi to mt i tng cho lp :
ListBoxmyListBox;
Mt khi chng ta to mt th hin ca lp ListBoxth ta c th gn d liu cho th hin . Tuy nhin on lnh trn cha th to i tng trong b nh c, ta s bn tip. By gi ta s tm hiu cch to mt lp v to cc th hin thng qua v d minh ha 4.1. V d ny to mt lp c chc nng hiu th thi gian trong mt ngy. Lp ny c hnh vi th hin ngy, thng, nm, gi, pht, giy hin hnh. lm c iu trn th lp ny c 6 thuc tnh hay cn gi l bin thnh vin, cng vi mt phng thc nh sau: V d 4.1: To mt lp Thoigian n gin nh sau. ----------------------------------------------------------------------------usingSystem; publicclassThoiGian { publicvoidThoiGianHienHanh() { Console.WriteLine(Hienthithoigianhienhanh); } //Ccbinthnhvinint Nam; int Thang; intNgay;int Gio; intPhut; intGiay; } publicclassTester { staticvoidMain() { Xy Dng Lp - i Tng
160
ThoiGiant=newThoiGian(); t.ThoiGianHienHanh(); } }
161
Xy Dng Lp - i Tng
----------------------------------------------------------------------------Kt qu:
Hien thi thoi gian hien hanh
----------------------------------------------------------------------------Lp ThoiGian ch c mt phng thc chnh l hm ThoiGianHienHanh(), phn thn ca phng thc ny c nh ngha bn trong ca lp ThoiGian. iu ny khc vi ngn ng C++, C# khng i hi phi khai bo trc khi nh ngha mt phng thc, v cng khng h tr vic khai bo phng thc trong mt tp tin v sau nh ngha mt tp tin khc. C# khng c cc tp tin tiu , do vy tt c cc phng thc c nh ngha hon ton bn trong ca lp. Phn cui ca nh ngha lp l phn khai bo cc bin thnh vin: Nam, Thang, Ngay, Gio, Phut, va Giay. Sau khi nh ngha xong lp ThoiGian, th tip theo l phn nh ngha lp Tester, lp ny c cha mt hm kh thn thin vi chng ta l hm Main(). Bn trong hm Main c mt th hin ca lp ThoiGian c to ra v gn gi tr cho i tng t. Bi v t l th hin ca i tng ThoiGian, nn hm Main()c th s dng phng thc ca t:
t.ThoiGianHienHanh();
Gii hn truy cp Khng hn ch. Nhng thnh vin c nh du publicc th c dng bi bt k cc phng thc ca lp bao gm nhng lp khc. Thnh vin trong mt lp A c nh du l private th ch c truy cp bi cc phng thc ca lp A. Thnh vin trong lp A c nh du l protected th ch c cc phng thc bn trong lp A v nhng phng thc dn xut t lp A truy cp. Thnh vin trong lp A c nh du l internalth c truy cp bi nhng phng thc ca bt c lp
private protected
internal
162
Xy Dng Lp - i Tng
protectedinternal
Thnh
vin trong lp
nh
du
protectedinternal c
163
Xy Dng Lp - i Tng
Bng 4.1: Thuc tnh truy cp. Mong mun chung l thit k cc bin thnh vin ca lp thuc tnh private. Khi ch c phng thc thnh vin ca lp truy cp c gi tr ca bin. C# xem thuc tnh
private l
nn mc nh chng l private:
//Ccbinthnhvinprivateint Nam; int Thang; intNgay;int Gio; intPhut; intGiay;
Do lp Tester v phng thc thnh vin ThoiGianHienHanh ca lp ThoiGian c khai bo l publicnn bt k lp no cng c th truy cp c. Ghi ch: Thi quen lp trnh tt l khai bo tng minh cc thuc tnh truy cp ca bin thnh vin hay cc phng thc trong mt lp. Mc d chng ta bit chc chn rng cc thnh vin ca lp l c khai bo privatemc nh. Vic khai bo tng minh ny s lm cho chng trnh d hiu, r rng v t nhin hn.
Bn trong thn ca phng thc, cc tham s ny c xem nh nhng bin cc b, ging nh l ta khai bo bin bn trong phng thc v khi to gi tr bng gi tr ca tham s truyn vo. V d 4.2 minh ha vic truyn tham s vo mt phng thc, trong trng hp ny th hai tham s ca kiu l intv float.
Xy Dng Lp - i Tng
164
165
Xy Dng Lp - i Tng
usingSystem; publicclassClass1 { publicvoidSomeMethod(intp1,floatp2) { Console.WriteLine(Hamnhanduochaithamso:{0}va{1},p1,p2); } } publicclassTester { staticvoidMain() { intvar1=5; floatvar2=10.5f; Class1c=newClass1(); c.SomeMethod(var1,var2); } }
----------------------------------------------------------------------------Kt qu:
Ham nhan duoc hai tham so: 5 va 10.5
----------------------------------------------------------------------------Phng thc SomeMethod s ly hai tham s int v float ri hin th chng ta mn hnh bng vic dng hm Console.WriteLine(). Nhng tham s ny c tn l p1v p2 c xem nh l bin cc b bn trong ca phng thc. Trong phng thc gi Main, c hai bin cc b c to ra l var1v var2. Khi hai bin ny c truyn cho phng thc SomeMethodth chng c nh x thnh hai tham s p1 v
p2theo
To i tng
Trong Chng 3 c cp n s khc nhau gia kiu d liu gi tr v kiu d liu tham chiu. Nhng kiu d liu chun ca C# nh int, char, float, l nhng kiu d liu gi tr, v cc bin c to ra t cc kiu d liu ny c lu trn stack. Tuy nhin, vi cc i tng kiu d liu tham chiu th c to ra trn heap, s dng t kha new to mt i tng:
ThoiGiant=newThoiGian(); Xy Dng Lp - i Tng
166
167
Xy Dng Lp - i Tng
ttht
B khi dng
Th xem li v d minh ha 4.1, cu lnh to mt i tng cho lp ThoiGiantng t nh vic gi thc hin mt phng thc:
ThoiGiant=newThoiGian();
ng nh vy, mt phng thc s c gi thc hin khi chng ta to mt i tng. Phng thc ny c gi l b khi dng (constructor). Cc phng thc ny c nh ngha khi xy dng lp, nu ta khng to ra th CLR s thay mt chng ta m to phng thc khi dng mt cch mc nh. Chc nng ca b khi dng l to ra i tng c xc nh bi mt lp v t trng thi ny hp l. Trc khi b khi dng c thc hin th i tng cha c cp pht trong b nh. Sau khi b khi dng thc hin hon thnh th b nh s lu gi mt th hin hp l ca lp va khai bo. Lp ThoiGiantrong v d 4.1 khng nh ngha b khi dng. Do khng nh ngha nn trnh bin dch s cung cp mt b khi dng cho chng ta. Phng thc khi dng mc nh c to ra cho mt i tng s khng thc hin bt c hnh ng no, tc l bn trong thn ca phng thc rng. Cc bin thnh vin c khi to cc gi tr tm thng nh thuc tnh nguyn c gi tr l 0 v chui th khi to rng,..Bng 4.2 sau tm tt cc gi tr mc nh c gn cho cc kiu d liu c bn. Kiu d liu
int,long,byte, bool char enum reference
Gi tr mc nh
0 false \0(null) 0 null
Bng 4.2: Gi tr mc nh ca kiu d liu c bn. Thng thng, khi mun nh ngha mt phng thc khi dng ring ta phi cung cp cc tham s hm khi dng c th khi to cc gi tr khc ngoi gi tr mc nh cho cc i tng. Quay li v d 4.1 gi s ta mun truyn thi gian hin hnh: nm, thng, ngy, i tng c ngha hn. nh ngha mt b khi dng ring ta phi khai bo mt phng thc c tn ging nh tn 168
Xy Dng Lp - i Tng
sch tham s ging nh khai bo vi bt k phng thc no trong mt lp. V d 4.3 c vit li t v d 4.1 v thm mt b khi dng ring, phng phc khi dng ny s nhn mt tham s l mt i tng kiu DateTimedo C# cung cp.
169
Xy Dng Lp - i Tng
V d 4.3: nh ngha mt b khi dng. ----------------------------------------------------------------------------usingSystem; publicclassThoiGian { publicvoidThoiGianHienHanh() { Console.WriteLine(Thoigianhienhanhla:{0}/{1}/{2} {3}:{4}:{5},Ngay,Thang,Nam,Gio,Phut,Giay); } //Hmkhidng publicThoiGian(System.DateTimedt) { Nam=dt.Year;Thang =dt.Month;Ngay= dt.Day; Gio=dt.Hour;Phut= dt.Minute;Giay= dt.Second; } //Binthnhvinprivateint Nam; int Thang; intNgay;int Gio; intPhut; intGiay; } publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;ThoiGian t=newThoiGian(currentTime);t.ThoiGianHienHanh();
170
Xy Dng Lp - i Tng
} }
-----------------------------------------------------------------------------
171
Xy Dng Lp - i Tng
Kt qu:
Thoi gian hien hanh la: 5/6/2002 9:10:20
----------------------------------------------------------------------------Trong v d trn phng thc khi dng ly mt i tng DateTimev khi to tt c cc bin thnh vin da trn gi tr ca i tng ny. Khi phng thc ny thc hin xong, mt i tng ThoiGian c to ra v cc bin ca i tng cng c khi to. Hm
ThoiGianHienHanhc
to ra. Chng ta th b mt s lnh khi to trong phng thc khi dng v cho thc hin chng trnh li th cc bin khng c khi to s c gi tr mc nh l 0, do l bin nguyn. Mt bin thnh vin kiu nguyn s c thit lp gi tr l 0 nu chng ta khng gn n trong phng thc khi dng. Ch rng kiu d liu gi tr khng th khng c khi to, nu ta khng khi to th trnh bin dch s cung cp cc gi tr mc nh theo bng 4.2. Ngoi ra trong chng trnh 4.3 trn c s dng i tng ca lp DateTime, lp
DateTimeny
vin publicnh: Year, Month, Day, Hour, Minute, v Second tng t nh lp ThoiGian ca chng ta. Thm vo l lp ny c a ra mt phng thc thnh vin tnh tn l Now, phng thc Now s tr v mt tham chiu n mt th hin ca mt i tng
DateTime c
khi to
c thc hin th phng thc tnh Now() s to ra mt i tng DateTime trn b nh heap v tr v mt tham chiu v tham chiu ny c gn cho bin i tng currentTime. Sau khi i tng currentTimec to th cu lnh tip theo s thc hin vic truyn i tng currentTimecho phng thc khi dng to mt i tng ThoiGian:
ThoiGiant=newThoiGian(currentTime);
Bn trong phng thc khi dng ny tham s dt s tham chiu n i tng DateTimel i tng va to m currentTime cng tham chiu. Ni cch khc lc ny tham s dt v
currentTime
phng thc khi dng ThoiGian c th truy cp c cc bin thnh vin public ca i tng DateTimec to trong hm Main(). C mt s nhn mnh y l i tng DateTimec truyn cho b dng ThoiGianchnh l i tng c to trong hm Main v l kiu d liu tham chiu. Do vy khi thc hin truyn tham s l mt kiu d liu tham chiu th con tr c nh x qua 172
Xy Dng Lp - i Tng
173
Xy Dng Lp - i Tng
Vic khi to bin thnh vin s rt c ngha, v khi xc nh gi tr khi to nh vy th bin s khng nhn gi tr mc nh m trnh bin dch cung cp. Khi nu cc bin ny khng c gn li trong cc phng thc khi dng th n s c gi tr m ta khi to. V d 4.4 minh ha vic khi to bin thnh vin khi khai bo. Trong v d ny s c hai b dng ngoi b dng mc nh m trnh bin dch cung cp, mt b dng thc hin vic gn gi tr cho tt c cc bin thnh vin, cn b dng th hai th cng tng t nhng s khng gn gi tr cho bin Giay. V d 4.4: Minh ho s dng khi to bin thnh vin. ----------------------------------------------------------------------------publicclassThoiGian { publicvoidThoiGianHienHanh() { System.DateTimenow=System.DateTime.Now;System.Console.WriteLine(\n Hientai:\t{0}/{1}/{2}{3}:{4}:{5}, now.Day,now.Month,now.Year,now.Hour,now.Minute,now.Second); System.Console.WriteLine(ThoiGian:\t{0}/{1}/{2}{3}:{4}:{5}, Ngay,Thang,Nam,Gio,Phut,Giay); } publicThoiGian(System.DateTimedt) { Nam=dt.Year;Thang =dt.Month;Ngay= dt.Day; Gio=dt.Hour;Phut =dt.Minute; Giay=dt.Second; } Xy Dng Lp - i Tng //cgnchobinthnhvinGiay
174
175
Xy Dng Lp - i Tng
Gio=Hour; Phut=Minute; } privateintNam; privateintThang; privateintNgay; privateintGio; privateintPhut; privateintGiay=30;//binckhito. } publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;ThoiGian t1=newThoiGian(currentTime);t1.ThoiGianHienHanh(); ThoiGiant2=newThoiGian(2001,7,3,10,5); t2.ThoiGianHienHanh(); } }
----------------------------------------------------------------------------Kt qu:
Hien tai: Thoi Gian: 5/6/2002 5/6/2002 10:15:5 10:15:5
5/6/2002 3/7/2001
10:15:5 10:5:30
----------------------------------------------------------------------------Nu khng khi to gi tr ca bin thnh vin th b khi dng mc nh s khi to gi tr l 0 mc nh cho bin thnh vin c kiu nguyn. Tuy nhin, trong trng hp ny bin thnh vin Giayc khi to gi tr 30:
Giay=30; //Khito
Trong trng hp b khi to th hai khng truyn gi tr cho bin Giaynn bin ny vn ly gi tr m ta khi to ban u l 30:
ThoiGiant2=newThoiGian(2001,7,3,10,5); Xy Dng Lp - i Tng
176
t2.ThoiGianHienHanh();
177
Xy Dng Lp - i Tng
Ngc li, nu mt gi tr c gn cho bin Giaynh trong b khi to th nht th gi tr mi ny s c chng ln gi tr khi to. Trong v d trn ln u tin to i tng ThoiGian do ta truyn vo i tng DateTime nn hm khi dng th nht c thc hin, hm ny s gn gi tr 5 cho bin Giay. Cn khi to i tng ThoiGianth hai, hm khi dng th hai c thc hin, hm ny khng gn gi tr cho bin Giaynn bin ny vn cn lu gi li gi tr 30 khi khi to ban u.
c cng
gi tr vi i tng ThoiGianc. Hai i tng ny hon ton khc nhau v ch ging nhau gi tr bin thnh vin sao khi khi dng. Ngn ng C# khng cung cp b khi dng sao chp, do chng ta phi t to ra. Vic sao chp cc thnh phn t mt i tng ban u cho mt i tng mi nh sau:
publicThoiGian(ThoiGiantg) { Nam=tg.Nam;Thang =tg.Thang;Ngay= tg.Ngay;Gio=tg.Gio; Phut=tg.Phut; Giay=tg.Giay; }
Trong t1l i tng ThoiGian tn ti, sau khi lnh trn thc hin xong th i tng
t2c
T kha this
T kha this c dng tham chiu n th hin hin hnh ca mt i tng. Tham chiu this ny c xem l con tr n n tt cc phng thc khng c thuc tnh tnh trong mt lp. Mi phng thc c th tham chiu n nhng phng thc khc v cc bin thnh vin thng qua tham chiu thisny. Tham chiu thisny c s dng thng xuyn theo ba cch: S dng khi cc bin thnh vin b che lp bi tham s a vo, nh trng hp sau:
publicvoidSetYear(intNam) Xy Dng Lp - i Tng
178
{ this.Nam=Nam;
179
Xy Dng Lp - i Tng
Nh trong on m trn phng thc SetYear s thit lp gi tr ca bin thnh vin Nam, tuy nhin do tham s a vo c tn l Nam, trng vi bin thnh vin, nn ta phi dng tham chiu this xc nh r cc bin thnh vin v tham s c truyn vo. Khi
this.Nam
ch n bin thnh vin ca i tng, trong khi Namch n tham s. S dng tham chiu this truyn i tng hin hnh vo mt tham s ca mt phng thc ca i tng khc:
publicvoidMethod1(OtherClassotherObject) { //Sdngthamchiuthistruynthamslbn //thnitngangthchin. otherObject.SetObject(this); }
Nh trn cho thy khi cn truyn mt tham s l chnh bn thn ca i tng ang thc hin th ta bt buc phi dng tham chiu this truyn. Cc th ba s dng tham chiu this l mng ch mc (indexer), phn ny s c trnh by chi tit trong chng 9.
ng hn l vit:
btnUpdate.Show();
Ghi ch: Trong ngn ng C# khng cho php truy cp n cc phng thc tnh v cc bin thnh vin tnh thng qua mt th hin, nu chng ta c lm iu th trnh bin dch C# s bo li, iu ny khc vi ngn ng C++. Trong mt s ngn ng th c s phn chia gia phng thc ca lp v cc phng thc khc (ton cc) tn ti bn ngoi khng ph thuc bt c mt lp no. Tuy nhin, 180
Xy Dng Lp - i Tng
iu ny khng cho php trong C#, ngn ng C# khng cho php to cc phng thc bn ngoi ca lp, nhng ta c th to c cc phng thc ging nh vy bng cch to cc phng thc tnh bn trong mt lp.
181
Xy Dng Lp - i Tng
Phng thc tnh hot ng t nhiu ging nh phng thc ton cc, ta truy cp phng thc ny m khng cn phi to bt c th hin hay i tng ca lp cha phng thc ton cc. Tuy nhin, li ch ca phng thc tnh vt xa phng thc ton cc v phng thc tnh c bao bc trong phm vi ca mt lp ni n c nh ngha, do vy ta s khng gp tnh trng ln xn gia cc phng thc trng tn do chng c t trong namespace. Ghi ch: Chng ta khng nn b cm d bi vic to ra mt lp cha ton b cc phng thc linh tinh. iu ny c th tin cho cng vic lp trnh nhng s iu khng mong mun v gim tnh ngha ca vic thit k hng i tng. V c tnh ca vic to cc i tng l xy dng cc phng thc v hnh vi xung quanh cc thuc tnh hay d liu ca i tng.
Phng thc SomeMethod() l phng thc khng tnh ca lp Class1, do truy cp c phng thc ca lp ny cn phi to mt th hin l mt i tng cho lp Class1.
Lu rng y khng c bt c thuc tnh truy cp no nh public trc b khi dng tnh. Thuc tnh truy cp khng cho php theo sau mt phng thc khi dng tnh. Do phng thc tnh nn khng th truy cp bt c bin thnh vin khng thuc loi tnh, v vy bin thnh vin Namebn trn cng phi c khai bo l tnh:
privatestaticstringTen;
Mc d chng trnh thc hin tt, nhng khng cn thit phi to ra b khi dng tnh phc v cho mc ch ny. Thay vo ta c th dng chc nng khi to bin thnh vin nh sau:
privatestaticstringTen=ThoiGian;
Tuy nhin, b khi to tnh c hu dng khi chng ta cn ci t mt s cng vic m khng th thc hin c thng qua chc nng khi dng v cng vic ci t ny ch c
Catmiu=newCat(); Cat.HowManyCats(); } }
----------------------------------------------------------------------------Kt qu:
0 cats 1 cats 3 cats
----------------------------------------------------------------------------Bn trong lp Cat ta khai bo mt bin thnh vin tnh tn l instance bin ny dng m s th hin ca lp Cat, bin ny c khi to gi tr 0. Lu rng bin thnh vin tnh c xem l thnh phn ca lp, khng phi l thnh vin ca th hin, do vy n s khng c khi to bi trnh bin dch khi to cc th hin. Khi to tng minh l yu cu bt buc vi cc bin thnh vin tnh. Khi mt th hin c to ra th b dng ca lp
Cat s
thc hin
Hy i tng
Ngn ng C# cung cp c ch thu dn (garbage collection) v do vy khng cn phi khai bo tng minh cc phng thc hy. Tuy nhin, khi lm vic vi cc on m khng c qun l th cn phi khai bo tng minh cc phng thc hy gii phng cc ti nguyn. C# cung cp ngn nh mt phng thc thc hin iu khin cng vic ny, phng thc l Finalize()hay cn gi l b kt thc. Phng thc Finalizeny s c gi bi c ch thu dn khi i tng b hy. Phng thc kt thc ch gii phng cc ti nguyn m i tng nm gi, v khng tham chiu n cc i tng khc. Nu vi nhng on m bnh thng tc l cha cc tham chiu kim sot c th khng cn thit phi to v thc thi phng thc Finalize(). Chng ta ch lm iu ny khi x l cc ti nguyn khng kim sot c. Chng ta khng bao gi gi mt phng thc Finalize() ca mt i tng mt cch trc tip, ngoi tr gi phng thc ny ca lp c s khi bn trong phng thc
Finalize()ca
chng ta. Trnh thu dn s thc hin vic gi Finalize() cho chng ta. Cch Finalizethc hin
B thu dn duy tr mt danh sch nhng i tng c phng thc Finalize. Danh sch ny c cp nht mi ln khi i tng cui cng c to ra hay b hy. Khi mt i tng trong danh sch kt thc ca b thu dn c chn u tin. N s c t vo hng i (queue) cng vi nhng i tng khc ang ch kt thc. Sau khi phng thc Finalizeca i tng thc thi b thu dn s gom li i tng v cp nht li danh sch hng i, cng nh l danh sch kt thc i tng.
B hy ca C#
C php phng thc hy trong ngn ng C# cng ging nh trong ngn ng C++. Nhng v hnh ng c th chng c nhiu im khc nhau. Ta khao bo mt phng thc hy trong C# nh sau:
~Class1(){}
Tuy nhin, trong ngn ng C# th c php khai bo trn l mt shortcut lin kt n mt phng thc kt thc Finalizec kt vi lp c s, do vy khi vit
~Class1() { //Thchinmtscngvic }
Do s tng t nh trn nn kh nng dn n s ln xn nhm ln l khng trnh khi, nn chng ta phi trnh vit cc phng thc hy v vit cc phng thc Finalize tng minh nu c th c.
trnh by chi tit trong Chng 8. Giao din IDisposableyu cu nhng thnh phn thc thi ca n nh ngha mt phng thc tn l Dispose() thc hin cng vic dn dp m ta yu cu. ngha ca phng thc Disposel cho php chng trnh thc hin cc cng vic
dn dp hay gii phng ti nguyn mong mun m khng phi ch cho n khi phng thc
Finalize()c
gi.
Khi chng ta cung cp mt phng thc Dispose th phi ngng b thu dn gi phng thc Finalize() trong i tng ca chng ta. ngng b thu dn, chng ta gi mt phng thc tnh ca lp GC (garbage collector) l GC.SuppressFinalize() v truyn tham s l tham chiu this ca i tng. V sau phng thc Finalize() s dng gi phng thc Dispose() nh on m sau:
publicvoidDispose() { //Thchincngvicdndp //YucubthudcGCtrongthchinktthc GC.SuppressFinalize(this); } publicoverridevoidFinalize() { Dispose(); base.Finalize(); }
v phng thc Closec v t nhin hn phng thc Disposetrong cc i tng phng thc Close()vi thuc tnh public. Trong phng thc Close()n gin
Cu lnh using
Khi xy dng cc i tng chng ta khng th chc chn c rng ngi s dng c th gi hm Dispose(). V cng khng kim sot c lc no th b thu dn GCthc hin vic dn dp. Do cung cp kh nng mnh hn kim sot vic gii phng ti nguyn th C# a ra c php ch dn using, c php ny m bo phng thc Dispose() s c gi sm nht c th c. tng l khai bo cc i tng vi c php using v sau to mt phm vi hot ng cho cc i tng ny trong khi c bao bi du ({}). Khi khi phm vi ny kt thc, th phng thc Dispose() ca i tng s c gi mt cch t ng.
publicstaticvoidMain() { using(FontAfont=newFont(Arial,10.0f)) { //onmsdngAFont ....... }//TrnhbindchsgiDisposegiiphngAFont FontTFont=newFont(Tahoma,12.0f); using(TFont) { //onmsdngTFont ....... }//TrnhbindchgiDisposegiiphngTFont } }
----------------------------------------------------------------------------Trong phn khai bo u ca v d th i tng Font c khai bo bn trong cu lnh using. Khi cu lnh using kt thc, th phng thc Dispose ca i tng
Font s
c gi.
Cn trong phn khai bo th hai, mt i tng Font c to bn ngoi cu lnh using. Khi quyt nh dng i tng ny ta t n vo cu lnh using. V cng tng t nh trn khi khi cu lnh usingthc hin xong th phng thc Dispose() ca fontc gi.
Truyn tham s
Nh tho lun trong chng trc, tham s c kiu d liu l gi tr th s c truyn gi tr vo cho phng thc. iu ny c ngha rng khi mt i tng c kiu l gi tr c truyn vo cho mt phng thc, th c mt bn sao chp i tng c to ra bn trong phng thc. Mt khi phng thc c thc hin xong th i tng sao chp ny s c hy. Tuy nhin, y ch l trng hp bnh thng, ngn ng C# cn cung cp kh nng cho php ta truyn cc i tng c kiu gi tr di hnh thc l tham chiu. Ngn ng C# a ra mt b sung tham s l ref cho php truyn cc i tng gi tr vo trong phng thc theo kiu tham chiu. V tham s b sung out trong trng hp mun truyn di dng tham chiu m khng cn phi khi to gi tr ban u cho tham s truyn. Ngoi ra ngn ng C# cn h tr b sung params cho php phng thc chp nhn nhiu s lng cc tham s.
Nhng phng thc ch c th tr v duy nht mt gi tr, mc d gi tr ny c th l mt tp hp cc gi tr. Nu chng ta mun phng thc tr v nhiu hn mt gi tr th cch thc hin l to cc tham s di hnh thc tham chiu. Khi trong phng thc ta s x l v
gn cc gi tr mi cho cc tham s tham chiu ny, kt qu l sau khi phng thc thc hin xong ta dng cc tham s truyn vo nh l cc kt qu tr v. V d 4.7 sau minh ha vic truyn tham s tham chiu cho phng thc. V d 4.7: Tr gi tr tr v thng qua tham s. ----------------------------------------------------------------------------usingSystem; publicclassTime { publicvoidDisplayCurrentTime() { Console.WriteLine({0}/{1}/{2}/{3}:{4}:{5},Date,Month,Year, Hour,Minute,Second); } publicintGetHour() { returnHour; } publicvoidGetTime(inth,intm,ints) { h=Hour; m=Minute; s=Second; } publicTime(System.DateTimedt) { Year=dt.Year;Month =dt.Month;Date= dt.Day;Hour= dt.Hour; Minute=dt.Minute; Second=dt.Second; } privateintYear; privateintMonth; privateintDate; p r i
} publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;Timet= newTime(currentTime); t.DisplayCurrentTime(); inttheHour=0; inttheMinute=0; inttheSecond=0; t.GetTime(theHour,theMinute,theSecond); System.Console.WriteLine(Currenttime:{0}:{1}:{2}, theHour,theMinute,theSecond); } }
----------------------------------------------------------------------------Kt qu:
8/6/2002 14:15:20 Current time: 0:0:0
----------------------------------------------------------------------------Nh ta thy, kt qu xut ra dng cui cng l ba gi tr 0:0:0, r rng phng thc GetTime() khng thc hin nh mong mun l gn gi tr Hour, Minute,
Second cho Second th
gi tr. Do thc hin nh mc ch ca chng ta l ly cc gi tr ca Hour, Minute, phng thc GetTime() c ba tham s c truyn di dng tham chiu. Ta thc hin nh sau, u tin, thm l thm khai bo refvo trc cc tham s trong phng thc GetTime():
publicvoidGetTime(refinth,refintm,refints) { h=Hour; m=Minute; s=Second; }
iu thay i th hai l b sung cch gi hm GetTime truyn cc tham s di dng tham chiu nh sau:
t.GetTime(reftheHour,reftheMinute,reftheSecond);
Nu chng ta khng thc hin bc th hai, tc l khng a t kha ref khi gi hm th trnh bin dch C# s bo mt li rng khng th chuyn tham s t kiu intsang kiu refint.
Cui cng khi bin dch li chng trnh ta c kt qu ng nh yu cu. Bng vic khai bo tham s tham chiu, trnh bin dch s truyn cc tham s di dng cc tham chiu, thay cho vic to ra mt bn sao chp cc tham s ny. Khi cc tham s bn trong GetTime()s tham chiu n cng bin c khai bo trong hm Main(). Nh vy mi s thay i vi cc bin ny iu c hiu lc tng t nh l thay i trong hm Main(). Tm li c ch truyn tham s dng tham chiu s thc hin trn chnh i tng c a vo. Cn c ch truyn tham s gi tr th s to ra cc bn sao cc i tng c truyn vo, do mi thay i bn trong phng thc khng lm nh hng n cc i tng c truyn vo di dng gi tr.
Vic s dng cc on lnh trn khng phi hon ton v l v mc ch ca chng ta l nhn cc gi tr ca i tng Time, vic khi to gi tr ca cc bin a vo l khng cn thit. Tuy nhin khi bin dch vi on m lnh nh trn s c bo cc li sau:
UseofunassignedlocalvariabletheHourUseof unassignedlocalvariabletheMinute UseofunassignedlocalvariabletheSecond
m rng cho yu cu trong trng hp ny ngn ng C# cung cp thm mt b sung tham chiu l out. Khi s dng tham chiu out th yu cu bt buc phi khi to cc tham s tham chiu c b qua. Nh cc tham s trong phng thc GetTime(), cc tham s ny khng cung cp bt c thng tin no cho phng thc m ch n gin l c ch nhn thng tin v a ra bn ngoi. Do vy ta c th nh du tt c cc tham s tham chiu ny l out, khi ta s gim c cng vic phi khi to cc bin ny trc khi a vo phng
thc. Lu l bn trong phng thc c cc tham s tham chiu out th cc tham s ny phi c gn gi tr trc khi tr v. Ta c mt s thay i cho phng thc GetTime() nh sau:
publicvoidGetTime(outinth,outintm,outints) { h=Hour;
m=Minute; s=Second; }
Tm li ta c cc cch khai bo cc tham s trong mt phng thc nh sau: kiu d liu gi tr c truyn vo phng thc bng gi tr. S dng tham chiu ref truyn kiu d liu gi tr vo phng thc di dng tham chiu, cch ny cho php va s dng v c kh nng thay i cc tham s bn trong phng thc c gi. Tham chiu outc s dng ch tr v gi tr t mt phng thc. V d 4.8 sau s dng ba kiu tham s trn. V d 4.8: S dng tham s. ----------------------------------------------------------------------------usingSystem; publicclassTime { publicvoidDisplayCurrentTime() { Console.WriteLine({0}/{1}/{2}{3}:{4}:{5},Date,Month, Year,Hour,Minute,Second); } publicintGetHour() { returnHour; } publicvoidSetTime(inthr,outintmin,refintsec) { //Nusgiytruynvo>30thtngsMinutevSecond=0 if(sec>=30) { Minute++; Second=0; } Hour=hr;//thitlpgitrhrctruynvo //Trvgitrmichominvsecmin= Minute;
sec=Second; } publicTime(System.DateTimedt)
{ Year=dt.Year;Month =dt.Month;Date= dt.Day;Hour= dt.Hour; Minute=dt.Minute; Second=dt.Second; } //binthnhvinprivate privateintYear; privateintMonth; privateintDate; privateintHour; privateintMinute; privateintSecond; } publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;Timet= newTime(currentTime); t.DisplayCurrentTime(); inttheHour=3; inttheMinute; inttheSecond=20; t.SetTime(theHour,outtheMinute,reftheSecond); Console.WriteLine(TheMinuteisnow:{0}and{1}seconds, theMinute,theSecond); theSecond=45; t.SetTime(theHour,outtheMinute,reftheSecond); Console.WriteLine(TheMinuteisnow:{0}and{1}seconds, theMinute,theSecond);
} }
----------------------------------------------------------------------------Kt qu:
8/6/2002 15:35:24
The Minute is now: 35 and 24 seconds The Minute is now: 36 and 0 seconds
----------------------------------------------------------------------------Phng thc SetTime trn minh ha vic s dng ba kiu truyn tham s vo mt phng thc. Tham s th nht theHour c truyn vo dng gi tr, mc ch ca tham s ny l thit lp gi tr cho bin thnh vin Hourv tham s ny khng c s dng v bt c gi tr no. Tham s th hai l theMinutec truyn vo phng thc ch nhn gi tr tr v ca bin thnh vin Minute, do tham s ny c khai bo vi t kha out. Cui cng tham s theSecondc truyn vo vi khai bo ref, bin tham s ny va dng thit lp gi tr trong phng thc. Nu theSecond ln hn 30 th gi tr ca bin thnh vin Minute tng thm mt n v v bin thnh vin Second c thit lp v 0. Sau cng th theSecondc gn gi tr ca bin thnh vin Secondv c tr v. Do hai bin theHourv theSecondc s dng trong phng thc SetTimenn phi c khi to trc khi truyn vo phng thc. Cn vi bin theMinuteth khng cn thit v n khng c s dng trong phng thc m ch nhn gi tr tr v.
voidmyMethod(intp1,intp2); voidmyMethod(intp1,stringp2);
Mt lp c th c bt c s lng phng thc no, nhng mi phng thc trong lp phi c k hiu khc vi tt c cc phng thc thnh vin cn li ca lp.
V d 4.9 minh ha lp Timec hai phng thc khi dng, mt phng thc nhn tham s l mt i tng DateTimecn phng thc th hai th nhn su tham s nguyn. V d 4.9: Minh ha np chng phng thc khi dng. ----------------------------------------------------------------------------usingSystem; publicclassTime { publicvoidDisplayCurrentTime() { Console.WriteLine({0}/{1}/{2}{3}:{4}:{5},Date,Month, Year,Hour,Minute,Second); } publicTime(System.DateTimedt) { Year=dt.Year;Month =dt.Month;Date= dt.Day;Hour= dt.Hour; Minute=dt.Minute; Second=dt.Second; } publicTime(intYear,intMonth,intDate,intHour,intMinute,intSecond) { this.Year=Year; this.Month=Month; this.Date=Date;this.Hour =Hour;this.Minute= Minute;this.Second= Second; } //Binthnhvinprivate privateintYear; privateintMonth; privateintDate; p r i v
----------------------------------------------------------------------------Kt qu:
2/1/2002 8/6/2002 17:50:17 18:15:20
----------------------------------------------------------------------------Nh chng ta thy, lp Timetrong v d minh ha 4.9 c hai phng thc khi dng. Nu hai phng thc c cng k hiu th trnh bin dch s khng th bit c gi phng thc no khi khi to hai i tng l t1v t2. Tuy nhin, k hiu ca hai phng thc ny khc nhau v tham s truyn vo khc nhau, do trnh bin dch s xc nh c phng thc no c gi da vo cc tham s. Khi thc hin np chng mt phng thc, bt buc chng ta phi thay i k hiu ca phng thc, s tham s, hay kiu d liu ca tham s. Chng ta cng c th ton quyn thay i gi tr tr v, nhng y l ty chn. Nu ch thay i gi tr tr v th khng phi np chng phng thc m khi hai phng thc khc nhau, v nu to ra hai phng thc cng k hiu nhng khc nhau kiu gi tr tr v s to ra mt li bin dch. V d 4.10: Np chng phng thc. ----------------------------------------------------------------------------usingSystem; publicclassTester { privateintTriple(intval) { return3*val; } privatelongTriple(longval)
{ return3*val;
} publicvoidTest() { intx=5; inty=Triple(x); Console.WriteLine(x:{0}y:{1},x,y); longlx=10; longly=Triple(lx); Console.WriteLine(lx:{0}ly:{1},lx,ly); } staticvoidMain() { Testert=newTester(); t.Test(); } }
----------------------------------------------------------------------------Kt qu:
x: 5 y: 15 lx: 10 ly:30
----------------------------------------------------------------------------Trong v d ny, lp Testernp chng hai phng thc Triple(), mt phng thc nhn tham s nguyn int, phng thc cn li nhn tham s l s nguyn long. Kiu gi tr tr v ca hai phng thc khc nhau, mc d iu ny khng i hi nhng rt thch hp trong trng hp ny.
qua vic to cc phng thc ly d liu (getter method) v phng thc thit lp d liu (setter method).
Thuc tnh c thit k nhm vo hai mc ch: cung cp mt giao din n cho php truy cp cc bin thnh vin, Tuy nhin cch thc thc thi truy cp ging nh phng thc trong cc d liu c che du, m bo cho yu cu thit k hng i tng. hiu r c tnh ny ta s xem v d 4.11 bn di: V d 4.11: S dng thuc tnh. ----------------------------------------------------------------------------usingSystem; publicclassTime { publicvoidDisplayCurrentTime() { Console.WriteLine(Time\t:{0}/{1}/{2}{3}:{4}:{5},date,month, year,hour,minute,second); } publicTime(System.DateTimedt) { year=dt.Year;month =dt.Month;date= dt.Day; hour=dt.Hour;minute= dt.Minute;second= dt.Second; } publicintHour { get { returnhour; } set { } } hour=value;
privateinthour; privateintminute; privateintsecond; } publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;Timet= newTime(currentTime);t.DisplayCurrentTime(); //LydliutthuctnhHourint theHour=t.Hour; Console.WriteLine(Retrievedthehour:{0},theHour); theHour++; t.Hour=theHour; Console.WriteLine(Updatedthehour:{0},theHour); } }
----------------------------------------------------------------------------Kt qu:
Time : 2/1/2003 17:55:1 Retrieved the hour: 17 Updated the hour: 18
---------------------------------------------------------------------------- khai bo thuc tnh, u tin l khai bo tn thuc tnh truy cp, tip theo l phn thn nh ngha thuc tnh nm trong cp du ({}). Bn trong thn ca thuc tnh l khai bo hai b truy cp ly v thit lp d liu:
publicintHour { get { } set {
} return hour;
hour=value;
Mi b truy cp c khai bo ring bit lm hai cng vic khc nhau l ly hay thit lp gi tr cho thuc tnh. Gi tr thuc tnh c th c lu trong c s d liu, khi trong phn thn ca b truy cp s thc hin cc cng vic tng tc vi c s d lu. Hoc l gi tr thuc tnh c lu tr trong cc bin thnh vin ca lp nh trong v d:
privateinthour;
Trong v d ny, mt bin thnh vin cc b c tr v, nhng n cng c th truy cp d dng mt gi tr nguyn t c s d lu, hay thc hin vic tnh ton ty . Bt c khi no chng ta tham chiu n mt thuc tnh hay l gn gi tr thuc tnh cho mt bin th b truy cp ly d liu gets c thc hin c gi tr ca thuc tnh:
Timet=newTime(currentTime); inttheHour=t.Hour;
Khi lnh th hai c thc hin th gi tr ca thuc tnh s c tr v, tc l b truy cp ly d lu get s c thc hin v kt qu l gi tr ca thuc tnh c gn cho bin cc b
theHour.
trong phn thn ca b truy cp ta ch s dng bin thnh vin m thi. B truy cp thit lp hon ton cho php chng ta c th vit gi tr vo trong c s d lu hay cp nht bt c bin thnh vin no khc ca lp nu cn thit.
Khi chng ta gn mt gi tr cho thuc tnh th b truy cp thit lp d liu set s c t ng thc hin v mt tham s ngm nh s c to ra lu gi tr m ta mun gn:
theHour++; t.Hour=theHour;
Li ch ca hng tip cn ny cho php cc thnh phn bn ngoi (client) c th tng tc vi thuc tnh mt cch trc tip, m khng phi hy sinh vic che du d lu cng nh c tnh ng gi d lu trong thit k hng i tng.
Thuc tnh ch c
Gi s chng ta mun to mt phin bn khc cho lp Timecung cp mt s gi tr static hin th ngy v gi hin hnh. V d 4.12 minh ha cho cch tip cn ny. V d 4.12: S dng thuc tnh hng static. ----------------------------------------------------------------------------usingSystem; publicclassRightNow { //nhnghabkhitostaticchoccbinstaticstatic RightNow() { System.DateTimedt=System.DateTime.Now;Year= dt.Year; Month=dt.Month; Date=dt.Day;Hour= dt.Hour; Minute=dt.Minute; Second=dt.Second; } //Binthnhvinstatic publicstaticintYear;public staticintMonth;publicstatic intDate;publicstaticint Hour;publicstaticint Minute;publicstaticint Second;
} publicclassTester { staticvoidMain()
----------------------------------------------------------------------------Kt qu:
This year: 2002 This year: 2003
----------------------------------------------------------------------------on chng trnh trn hot ng tt, tuy nhin cho n khi c mt ai thay i gi tr ca bin thnh vin ny. Nh ta thy, bin thnh Year trn c thay i n 2003. iu ny thc s khng nh mong mun ca chng ta. Chng ta mun nh du cc thuc tnh tnh ny khng c thay i. Nhng khai bo hng cng khng c v bin tnh khng c khi to cho n khi phng thc khi dng staticc thi hnh. Do vy C# cung cp thm t kha readonly phc v chnh xc cho mc ich trn. Vi v d trn ta c cch khai bo li nh sau:
publicstaticreadonlyintYear;public staticreadonlyintMonth;publicstatic readonlyintDate;publicstatic readonlyintHour;publicstatic readonlyintMinute;publicstatic readonlyintSecond;
Chng trnh sau khi bin dch v thc hin nh mc ch ca chng ta.
Cu hi v tr li
Cuhi 1: C phi chng ta ch nn s dng lp vi cc d liu thnh vin? Tr li 1: Ni chung l chng ta khng nn s dng lp ch vi d liu thnh vin. ngha ca mt lp hay ca lp trnh hng i tng l kh nng ng gi cc chc nng v d liu vo trong mt gi n. Cu hi 2: C phi tt c nhng d liu thnh vin lun lun c khai bo l public bn
Tr li 2: Ni chung l khng. Do vn che du d liu trong lp trnh hng i tng, xu hng l d liu bn trong ch nn dng cho cc phng thc thnh vin. Tuy nhin, nh chng ta bit khi nim thuc tnh cho php cc bin thnh vin c truy cp t bn ngoi thng qua hnh thc nh l phng thc. Cuhi 3: C phi c rt nhiu lp c xy dng sn v ti c th tm chng u? Tr li 3: Microsoft cung cp rt nhiu cc lp gi l cc lp c s .NET. Nhng lp ny c t chc bn trong cc namespace. Chng ta c th tm ti liu v cc lp ny trong th vin trc tuyn ca Microsoft. V mt s lp thng s dng cng c trnh by ln lt trong cc v d ca gio trnh ny. Cuhi 4: S khc nhau gia tham s (parameter) v i mc (argument)? Tr li 4: Tham s c nh ngha l nhng th c truyn vo trong mt phng thc. Mt tham s xut hin vi nh ngha ca phng thc u phng thc. Mt i mc l gi tr c truyn vo phng thc. Chng ta truyn nhng i mc vo phng thc ph hp vi nhng tham s khai bo ca phng thc. Cuhi 5: Chng ta c th to phng thc bn ngoi ca lp hay khng? Tr li 5: Mc d trong nhng ngn ng khc, chng ta c th to cc phng thc bn ngoi ca lp. Nhng trong C# th khng, C# l hng i tng, do vy tt c cc m ngun phi c t bn trong mt lp. Cu hi 6: C phi nhng phng thc v lp trong C# hot ng tng t nh trong cc ngn ng khc nh C++ hay Java? Tr li 6: Trong hu ht cc phn th chng tng t nh nhau. Tuy nhin, mi ngn ng cng c nhng khc bit ring. Mt v d s khc nhau l C# khng cho php tham s mc nh bn trong mt phng thc. Trong ngn ng C++ th chng ta c th khai bo cc tham s mc nh lc nh ngha phng thc v khi gi phng thc th c th khng cn truyn gi tr vo, phng thc s dng gi tr mc nh. Trong C# th khng c php. Ni chung l cn nhiu s khc nhau na, nhng xin dnh cho bn c t tm hiu. Cu hi 7: Phng thc tnh c th truy cp c thnh vin no v khng truy cp c thnh vin no trong mt lp? Tr li 7: Phng thc tnh ch truy cp c cc thnh vin tnh trong mt lp.
Cu hi thm
Cu hi 1: S khc nhau gia thnh vin c khai bo l public v cc thnh vin khng c khai bo l public? Cuhi 2: T kho no c s dng trong vic thc thi thuc tnh ca lp? Cuhi 3: Nhng kiu d liu no c tr v t phng thc? Cu hi 4: S khc nhau gia truyn bin tham chiu v truyn bin tham tr vo
mt phng thc? Cuhi 5: Lm sao truyn tham chiu vi bin kiu gi tr vo trong mt phng thc?
Cuhi 6: Khi no th phng thc khi dng c gi? Cuhi 7: Phng thc khi dng tnh c gi khi no? Cuhi 8: C th truyn bin cha khi to vo mt hm c khng? Cuhi 9: S khc nhau gia mt lp v mt i tng ca lp? Cu hi 10: Thnh vin no trong mt lp c th c truy cp m khng phi to th hin ca lp? Cuhi 11: Lp m chng ta xy dng thuc kiu d liu no? Cuhi 12: T kha this c dng lm g trong mt lp?
Bi tp
Bi tp 1: Xy dng mt lp ng trn lu gi bn knh v tm ca ng trn. To cc phng thc tnh chu vi, din tch ca ng trn. Bi tp2: Thm thuc tnh BanKinh vo lp c to ra t bi tp 1. Bi tp 3: To ra mt lp lu tr gi tr nguyn tn myNumber. To thuc tnh cho thnh vin ny. Khi s c lu tr th nhn cho 100. V khi s c truy cp th chia cho 100. Bi tp 4: Chng trnh sau c li. Hy sa li ca chng trnh v bin dch chng trnh. Dng lnh no gy ra li? ----------------------------------------------------------------------------usingSystem; usingSystem.Console; classVD1 { publicstringfirst; } classTester { publicstaticvoidMain() { VD1vd=newVD1();Write(Nhap vaomotchuoi:);vd.first= ReadLine(); Write(Chuoinhapvao:{0},vd.first); } }
----------------------------------------------------------------------------Bi tp 5: Chng trnh sau c li. Hy sa li ca chng trnh v bin dch chng trnh.
----------------------------------------------------------------------------Cuhi 6: Chng trnh sau y c li. Hy sa li v cho bit lnh no pht sinh li? ----------------------------------------------------------------------------ClassTester { publicstaticvoidMain() { Display(); } publicstaticvoidDisplay() { System.Console.WriteLine(Hello!); return0; } }
----------------------------------------------------------------------------Cu hi 7: Vit lp gii phng trnh bc hai. Lp ny c cc thuc tnh a, b, c v nghim x1, x2. Hy xy dng theo hng i tng lp trn. Lp cho php bn ngoi xem c cc nghim ca phng trnh v cho php thit lp hay xem cc gi tr a, b, c.
Chng 5
K THA A HNH
c bit ha v tng qut ha S k tha
Thc thi k tha Gi phng thc khi dng ca lp c s Gi phng thc ca lp c s iu khin truy xut
a hnh
Kiu a hnh Phng thc a hnh T kha new v override
Lp tru tng
Gc ca tt c cc lp - lp Object
Cc lp lng nhau
Cu hi & bi tp
Trong chng trc trnh by cch to ra nhng kiu d liu mi bng vic xy dng cc lp i tng. Tip theo chng ny s a chng ta i su vo mi quan h gia nhng i tng trong th gii thc v cch m hnh ha nhng quan h trong xy dng chng trnh. Chng 5 cng gii thiu khi nim c bit ha (specialization) c ci t trong ngn ng C# thng qua s k tha (inheritance).
228
K Tha a Hnh
Khi nim a hnh (polymorphism) cng c trnh by trong chng 5, y l khi nim quan trng trong lp trnh hng i tng. Khi nim ny cho php cc th hin ca lp c lin h vi nhau c th c x l theo mt cch tng qut. Cui cng l phn trnh by v cc lp c lp (sealed class) khng c t bit ha, hay cc lp tru tng s dng trong c bit ha. Lp i tng Objectl gc ca tt c cc lp cng c tho lun phn cui chng.
NG VT C V
MO
CH
Tng t, khi chng ta ni rng ListBoxv Buttonl nhng Window, ta phi ch ra nhng c tnh v hnh vi ca nhng Windowc trong c hai lp trn. Hay ni cch khc, Window l tng qut ha chia x nhng thuc tnh ca hai lp ListBox v Button, trong khi mi trng hp c bit ListBoxv Buttons c ring nhng thuc tnh v hnh vi c th khc. Ngn ng m hnh ha thng nht (UML) UML ( Unified Modeling Language) l ngn ng chun ha m t cho mt h thng hoc thng mi. Trong chng ny s dng mt s phn ca m hnh UML trnh by cc biu quan h gia cc lp. Trong UML, nhng lp c th hin nh cc khi hp, tn ca lp c t trn cng ca khi hp, v cc phng thc hay cc bin thnh vin c t bn trong hp. Nh trong hnh 5.1, m hnh quan h tng qut ha v c bit ha c trnh by qua UML, ghi ch rng mi tn i t cc lp c bit ha n lp tng qut ha.
Window
Button
List Box
Hnh 5.2: Quan h gia thnh phn ca s Thng thng lu rng khi hai lp chia x chc nng vi nhau, th chng c trch ra cc phn chung v a vo lp c s chia x. iu ny ht sc c li, v n cung cp kh nng cao s dng li cc m ngun chung v d dng duy tr m ngun.
Window
Radio Button
Check Box
Command
List Box
Ngn Ng Lp Trnh C#
Hnh 5.3 Dn xut t Window Gi s chng ta bt u to mt lot cc lp i tng theo hnh v 5.3 nh bn trn. Sau khi lm vic vi RadioButton, CheckBox, v CommandButton mt thi gian ta nhn thy chng chia x nhiu thuc tnh v hnh vi c bit hn Windownhng li kh tng qut cho c ba lp ny. Nh vy ta c th chia cc thuc tnh v hnh vi thnh mt nhm lp c s ring ly tn l Button. Sau ta sp xp li cu trc k tha nh hnh v 5.4. y l v d v cch tng qut ha c s dng pht trin hng i tng.
Window
Button
List Box
Check Box
Command
Radio Button
Hnh 5.4: Cy quan h lp ca s Trong m hnh UML trn c v li quan h gia cc lp. Trong c hai lp Button v ListBoxiu dn xut t lp Window, trong Buttonc trng hp c bit l CheckBox v Command. Cui cng th RadioButton c dn xut t CheckBox. Chng ta cng c th
ni rng RadioButton l mt CheckBox, v tip tc CheckBox l mt Button, v cui cng Buttonl Window.
Ngn Ng Lp Trnh C#
S thit k trn khng phi l duy nht hay cch tt nht t chc nhng i tng, nhng l khi im hiu v cch quan h gia i tng vi cc i tng khc.
S k tha
Trong ngn ng C#, quan h c bit ha c thc thi bng cch s dng s k tha. y khng phi l cch duy nht thc thi c bit ha, nhng n l cch chung nht v t nhin nht thc thi quan h ny. Trong m hnh trc, ta c th ni ListBox k tha hay c dn xut t
Window. Window c
xut. Nh vy, ListBox dn xut tt c cc thuc tnh v hnh vi t lp Window v thm nhng phn c bit ring xc nhn ListBox.
Lp dn xut s k tha tt c cc thnh vin ca lp c s, bao gm tt c cc phng thc v bin thnh vin ca lp c s. Lp dn xut c t do thc thi cc phin bn ca mt phng thc ca lp c s. Lp dn xut cng c th to mt phng thc mi bng vic nh du vi t kha new. V d 5.1 sau minh ha vic to v s dng cc lp c s v dn xut. V d 5.1: S dng lp dn xut. ----------------------------------------------------------------------------usingSystem; publicclassWindow { //Hmkhidnglyhaisnguynch //nvtrcacastrnconsolepublic Window(inttop,intleft) { this.top=top; this.left=left; } //mphngvcaspublic
voidDrawWindow() {
Ngn Ng Lp Trnh C#
Console.WriteLine(DrawingWindowat{0},{1},top,left);
} //Chaibinthnhvinprivatedo //haibinnyskhngthybntronglp //dnxut. privateinttop; privateintleft; } //ListBoxdnxuttWindow publicclassListBox:Window { //Khidngcthams publicListBox(inttop,intleft, stringtheContents):base(top,left)//gikhidngcalpcs { mListBoxContents=theContents; } //TomtphinbnmichophngthcDrawWindow //vtronglpdnxutmunthayihnhvithchin //bntrongphngthcnypublic newvoidDrawWindow() { base.DrawWindow(); Console.WriteLine(ListBoxwrite:{0},mListBoxContents); } //binthnhvinprivate privatestringmListBoxContents; } publicclassTester { publicstaticvoidMain() { //toitngcholpcsWindow w=newWindow(5,10); w.DrawWindow(); //toitngcholpdnxut List Box lb= new List
Box(20,10,Helloworld!); lb.DrawWindow(); }
----------------------------------------------------------------------------Kt qu:
Drawing Window at: 5, 10 Drawing Window at: 20, 10 ListBoxwrite: Hello world!
----------------------------------------------------------------------------V d 5.1 bt u vi vic khai bo mt lp c s tn Window. Lp ny thc thi mt phng thc khi dng v mt phng thc n gin DrawWindow. Lp c hai bin thnh vin private l top v left, hai bin ny do khai bo l private nn ch s dng bn trong ca lp Window, cc lp dn xut s khng truy cp c. ta s bn tip v v d ny trong phn tip theo.
khi dng ca lp dn xut ny c gi phng thc khi dng ca lp c s. Cch gi c thc hin bng vic t du hai chm ngay sau phn khai bo danh sch tham s v tham chiu n lp c s thng qua t kha base:
public int ListBox( theTop,
Bi v cc lp khng c k tha cc phng thc khi dng ca lp c s, do lp dn xut phi thc thi phng thc khi dng ring ca n. V ch c th s dng phng thc khi dng ca lp c s thng qua vic gi tng minh. Mt iu lu trong v d 5.1 l vic lp ListBox thc thi mt phin bn mi ca phng thc DrawWindow():
publicnewvoidDrawWindow()
T kha new c s dng y ch ra rng ngi lp trnh ang to ra mt phin bn mi cho phng thc ny bn trong lp dn xut. Nu lp c s c phng thc khi dng mc nh, th lp dn xut khng cn bt buc phi gi phng thc khi dng ca lp c s mt cch tng minh. Thay vo phng thc khi dng mc nh ca lp c s s c gi mt cch ngm nh. Tuy nhin, nu
lp c s khng c phng thc khi dng mc nh, th tt c cc lp dn xut ca n phi gi phng thc khi dng ca lp c s mt cch tng minh thng qua vic s dng t kha base.
Ghi ch: Cng nh tho lun trong chng 4, nu chng ta khng khai bo bt c phng thc khi dng no, th trnh bin dch s to ring mt phng thc khi dng cho chng ta. Khi m chng ta vit ring cc phng thc khi dng hay l s dng phng thc khi dng mc nh do trnh bin dch cung cp hay khng th phng thc khi dng mc nh khng ly mt tham s no ht. Tuy nhin, lu rng khi ta to bt c phng thc khi dng no th trnh bin dch s khng cung cp phng thc khi dng cho chng ta.
Gi phng thc ca lp c s
Trong v d 5.1, phng thc DrawWindow() ca lp ListBoxs lm n v thay th phng phng thc
DrawWindow ca
lp
Window.
Khi
chng
ta
gi
thc DrawWindow ca mt i tng ca lp ListBox th phng thc s c thc hin, khng phi phng thc Window.DrawWindow()
ListBox.DrawWindow()
ca lp c s Window. Tuy nhin, ta c th gi phng thc DrawWindow() ca lp c s thng qua t kha base:
base.DrawWindow();//giphngthccs
Nh chng ta thy, public cho php mt thnh vin c th c truy cp bi mt phng thc thnh vin ca nhng lp khc. Trong khi private ch cho php cc phng thc thnh vin trong lp truy xut. T kha protected th m rng thm kh nng ca private cho php truy xut t cc lp dn xut ca lp . Internalm rng kh nng cho php bt c phng thc ca lp no trong cng mt khi kt hp (assembly) c th truy xut c. Mt khi kt hp c hiu nh l mt khi chia x v dng li trong CLR. Thng thng, khi ny l tp hp cc tp tin vt l c lu tr trong mt th mc bao gm cc tp tin ti nguyn, chng trnh thc thi theo ngn ng IL,... T kha internal protected i cng vi nhau cho php cc thnh vin ca cng mt khi assembly hoc cc lp dn xut ca n c th truy cp. Chng ta c th xem s thit k ny ging nh l internalhay protected. Cc lp cng nh nhng thnh vin ca lp c th c thit k vi bt c mc truy xut no. Mt lp thng c mc truy xut m rng hn cch thnh vin ca lp, cn cc thnh vin th mc truy xut thng c nhiu hn ch. Do , ta c th nh ngha mt lp MyClassnh sau:
Nh trn bin thnh vin myValue c khai bo truy xut protectedmc d bn thn lp c khai bo l public. Mt lp public l mt lp sn sng cho bt c lp no khc mun tng tc vi n. i khi mt lp c to ra ch tr gip cho nhng lp khc trong mt khi assemply, khi nhng lp ny nn c khai bo kha internal hn l kha public.
a hnh
C hai cch thc kh mnh thc hin vic k tha. Mt l s dng li m ngun, khi chng ta to ra lp ListBox, chng ta c th s dng li mt vi cc thnh phn trong lp c s nh Window. Tuy nhin, cch s dng th hai chng t c sc mnh to ln ca vic k tha l tnh a hnh (polymorphism). Theo ting Anh t ny c kt hp t poly l nhiu v morph c ngha l form (hnh thc). Do vy, a hnh c hiu nh l kh nng s dng nhiu hnh thc ca mt kiu m khng cn phi quan tm n tng chi tit. Khi mt tng i in thoi gi cho my in thoi ca chng ta mt tn hiu c cuc gi. Tng i khng quan tm n in thoi ca ta l loi no. C th ta ang dng mt in thoi c dng motor rung chung, hay l mt in thoi in t pht ra ting nhc s. Hon ton cc thng tin v in thoi ca ta khng c ngha g vi tng i, tng i ch bit mt kiu c bn l in thoi m thi v din thoi ny s bit cch bo chung. Cn vic bo chung nh th no th tng i khng quan tm. Tm li, tng i ch cn bo in thoi hy lm iu g reng. Cn phn cn li tc l cch thc reng l ty thuc vo tng loi in thoi. y chnh l tnh a hnh.
Kiu a hnh
Do mt ListBox l mt Window v mt Button cng l mt Window, chng ta mong mun s dng c hai kiu d liu ny trong tnh hung c hai c gi l Window. V d nh trong mt form giao din trn MS Windows, form ny cha mt tp cc th hin ca
Window.
hin vic t v. Trong trng hp ny, form khng mun bit thnh phn th hin l loi no nh Button, CheckBox,...,. iu quan trng l form kch hot ton b tp hp ny t thc hin vic v. Hay ni ngn gn l form mun i x vi nhng i tng
Windowny
mt cch a hnh.
khai bo nh sau:
publicvirtualvoidDrawWindow()
Lc ny th cc lp dn xut c t do thc thi cc cch x ring ca mnh trong phin bn mi ca phng thc DrawWindow(). lm c iu ny ch cn thm t kha
override
m ngun mi vo phng thc vit chng ny. Trong v d minh ha 5.2 sau, lp ListBoxdn xt t lp Windowv thc thi mt phin bn ring ca phng thc DrawWindow():
publicoverridevoidDrawWindow() { base.DrawWindow(); Console.WriteLine(Writingstringtothelistbox:{0},listBoxContents); }
T kha override bo vi trnh bin dch rng lp ny thc hin vic ph quyt li phng thc DrawWindow() ca lp c s. Tng t nh vy ta c th thc hin vic ph quyt phng thc ny trong mt lp dn xut khc nh Button, lp ny cng c dn xut t Window. Trong phn thn ca v d 5.2, u tin ta to ra ba i tng, i tng th nht ca Window, i tng th hai ca lp ListBox v i tng cui cng ca lp
Button.
Sau ta thc hin vic gi phng thc DrawWindow() cho mi i tng sau:
on chng trnh trn thc hin cc cng vic nh yu cu ca chng ta, l tng i tng thc hin cng vic t v ca n. Tuy nhin, cho n lc ny th cha c bt c s a hnh no c thc thi. Mi chuyn vn bnh thng cho n khi ta mun to ra mt mng cc i tng Window, bi v ListBox cng l mt Window nn ta c th t do t mt i tng ListBox vo v tr ca mt i tng Window trong mng trn. V tng t ta cng c th t mt i tng Button vo bt c v tr no trong mng cc i tng
Window,
v mt Buttoncng l mt Window.
Chuyn g xy ra khi chng ta gi phng thc DrawWindow() cho tng i tng trong mng winArray.
for(inti=0;i<3;i++) { winArray[i].DrawWindow();
Trnh bin dch iu bit rng c ba i tng Windows trong mng v phi thc hin vic gi phng thc DrawWindow() cho cc i tng ny. Nu chng ta khng nh du phng
DrawWindow()
thc DrawWindow()
trong
lp Window l
virtual
th
phng
thc
phng thc ny o lp c s v thc thi vic ph quyt phng thc ny cc lp dn xut. Khi ta gi phng thc DrawWindow trong mng, trnh bin dch s d ra c chnh xc kiu d liu no c thc thi trong mng khi c ba kiu s c thc thi l mt
Window,
tng i tng. y l iu ct li v tinh hoa ca tnh cht a hnh. on chng trnh hon chnh 5.2 minh ha cho s thc thi tnh cht a hnh. V d 5.2: S dng phng thc o. ----------------------------------------------------------------------------usingSystem; publicclassWindow { publicWindow(inttop,intleft) { this.top=top; this.left=left; } //phngthcckhaiboopublic virtualvoidDrawWindow() { Console.WriteLine(Window:drawingwindowat{0},{1},top,left); } //binthnhvincalp protectedinttop;protectedint left; } publicclassListBox:Window { //phngthckhidngcthams publicListBox(inttop,intleft, stringcontents):base(top,left)
{ listBoxContents=contents; } //thchinvicphquytphngthcDrawWindow
publicoverridevoidDrawWindow() { base.DrawWindow(); Console.WriteLine(Writingstringtothelistbox:{0},listBoxContents); } //binthnhvincaListBox privatestringlistBoxContents; } publicclassButton:Window { publicButton(inttop,intleft):base(top,left) { } //phquytphngthcDrawWindowcalpcspublic overridevoidDrawWindow() { Console.WriteLine(Drawingabuttonat{0}:{1},top,left); } } publicclassTester { staticvoidMain() { Windowwin=newWindow(1,2); ListBoxlb=newListBox(3,4,Standalonelistbox);Buttonb =newButton(5,6); win.DrawWindow(); lb.DrawWindow(); b.DrawWindow(); Window[]winArray=newWindow[3]; winArray[0]=newWindow(1,2); winArray[1]=newListBox(3,4,Listboxisarray); winArray[2]=newButton(5,6); for(inti=0;i<3;i++) { win Arra y[i]. Dra wWi ndo w(); } }
----------------------------------------------------------------------------Kt qu:
Window: drawing window at 1: 2 Window: drawing window at 3: 4 Writing string to the listbox: Stand alone list box Drawing a button at 5: 6 Window: drawing Window at 1: 2 Window: drawing window at 3: 4 Writing string to the listbox: List box is array Drawing a button at 5: 6
----------------------------------------------------------------------------Lu trong sut v d ny, chng ta nh du mt phng thc ph quyt mi vi t kha ph quyt override:
publicoverridevoidDrawWindow()
Lc ny trnh bin dch bit cch s dng phng thc ph quyt khi gp i tng mang hnh thc a hnh. Trnh bin dch chu trch nhim trong vic phn ra kiu d liu tht ca i tng sau ny x l. Do phng thc ListBox.DrawWindow() s c gi khi mt i tng Windowtham chiu n mt i tng tht s l ListBox. Ghi ch: Chng ta phi ch nh r rng vi t kha overridekhi khai bo mt phng thc ph quyt phng thc o ca lp c s. iu ny d lm ln vi ngi lp trnh C++ v t kha ny trong C++ c th b qua m trnh bin dch C++ vn hiu.
Khi nhm lp trnh ca cng ty B quyt nh thm mt phng thc Sort()vo lp ListBox:
publicclassListBox:Window { publicvirtualvoidSort(){.}
Vic thm vo vn bnh thng cho n khi cng ty A, tc gi ca lp c s Window, a ra phin bn th hai ca lp Window. V trong phin bn mi ny nhng ngi lp trnh ca cng ty A thm mt phng thc Sort( ) vo lp c s Window:
publicclassWindow { //.. publicvirtualvoidSort(){.} }
phng thc o trong lp ListBox. Trnh bin dch c th gi phng thc Sort( ) trong lp ListBox khi chng ta c nh gi phng thc Sort( ) trong Window. Trong ngn ng Java, nu phng thc Sort( ) trong Window c kiu tr v khc kiu tr v ca phng thc
Sort(
Ngn ng C# ngn nga s ln ln ny, trong C# mt phng thc o th c xem nh l gc r ca s phn phi o. Do vy, mt khi C# tm thy mt phng thc khai bo l o th n s khng thc hin bt c vic tm kim no trn cy phn cp k tha. Nu mt phng thc o Sort( ) c trnh by trong lp Window, th khi thc hin hnh vi ca lp Listboxkhng thay i. Tuy nhin khi bin dch li, th trnh bin dch s a ra mt cnh bo ging nh sau:
\class1.cs(54,24):warningCS0114:ListBox.Sort()hidesinherited memberWindow.Sort(). Tomakethecurrentmemberoverridethatimplementation,addthe overridekeyword.Otherwiseaddthenewkeyword.
loi b cnh bo ny, ngi lp trnh phi ch r nh ca anh ta. Anh ta c th nh du phng thc ListBox.Sort( ) vi t kha l new, v n khng phi ph quyt ca bt c phng thc o no trong lp Window:
publicclassListBox:Window { publicnewvirtualSort(){.} }
Vic thc hin khai bo trn s loi b c cnh bo. Mc khc nu ngi lp trnh
mun ph quyt mt phng thc trong Window, th anh ta cn thit phi dng t kha
override
Lp tru tng
Mi lp con ca lp Window nn thc thi mt phng thc DrawWindow() cho ring mnh. Tuy nhin iu ny khng thc s i hi phi thc hin mt cch bt buc. yu cu cc lp con (lp dn xut) phi thc thi mt phng thc ca lp c s, chng ta phi thit k mt phng thc mt cch tru tng. Mt phng thc tru tng khng c s thc thi. Phng thc ny ch n gin to ra mt tn phng thc v k hiu ca phng thc, phng thc ny s c thc thi cc lp dn xut. Nhng lp tru tng c thit lp nh l c s cho nhng lp dn xut, nhng vic to cc th hin hay cc i tng cho cc lp tru tng c xem l khng hp l. Mt khi chng ta khai bo mt phng thc l tru tng, th chng ta phi ngn cm bt c vic to th hin cho lp ny. Do vy, nu chng ta thit k phng thc DrawWindow() nh l tru tng trong lp Window, chng ta c th dn xut t lp ny, nhng ta khng th to bt c i tng cho lp ny. Khi mi lp dn xut phi thc thi phng thc DrawWindow(). Nu lp dn xut khng thc thi phng thc tru tng ca lp c s th lp dn xut cng l lp tru tng, v ta cng khng th to cc th hin ca lp ny c. Phng thc tru tng c thit lp bng cch thm t kha abstract vo u ca phn nh ngha phng thc, c php thc hin nh sau:
abstractpublicvoidDrawWindow();
Do phng thc khng cn phn thc thi, nn khng c du ({}) m ch c du chm phy (;) sau phng thc. Nh th vi phng thc DrawWindow() c thit k l tru tng th ch cn cu lnh trn l . Nu mt hay nhiu phng thc c khai bo l tru tng, th phn nh ngha lp phi c khai bo l abstract, vi lp Windowta c th khai bo l lp tru tng nh sau:
abstractpublicvoidWindow
V d 5.3 sau minh ha vic to lp Windowtru tng v phng thc tru tng
DrawWindow()
ca lp Window.
Window(inttop,intleft) {
this.top=top; this.left=left; } //phngthctrutngminhhavic //vracas abstractpublicvoidDrawWindow(); //binthnhvinprotected protectedinttop; protectedintleft; } //lpListBoxdnxuttlpWindowpublic classListBox:Window { //hmkhidnglybathams publicListBox(inttop,intleft,stringcontents):base(top,left) { listBoxContents=contents; } //phquytphngthctrutngDrawWindow() publicoverridevoidDrawWindow() { Console.WriteLine(Writingstringtothelistbox:{0},listBoxContents); } //binprivatecalp privatestringlistBoxContents; } //lpButtondnxuttlpWindowpublic classButton:Window { //hmkhitonhnhaithams publicButton(inttop,intleft):base(top,left) { } //thcthiphngthctrutngpublic
overridevoidDrawWindow() { } Console.WriteLine(Drawingbuttonat{0},{1}\n,top,left);
----------------------------------------------------------------------------Trong v d 5.3, lp Windowc khai bo l lp tru tng v do vy nn chng ta khng th to bt c th hin no ca lp Window. Nu chng ta thay th thnh vin u tin ca mng:
winArray[0]=newListBox(1,2,FirstListBox);
Chng ta c th to c cc th hin ca lp ListBox v Button, bi v hai lp ny ph quyt phng thc tru tng. Hay c th ni hai lp ny c xc nh (ngc vi lp tru tng). Hn ch ca lp tru tng Mc d chng ta thit k phng thc DrawWindow() nh mt lp tru tng h tr cho tt c cc lp dn xut c thc thi ring, nhng iu ny c mt s hn ch. Nu chng ta dn xut mt lp t lp ListBoxnh lp DropDownListBox, th lp ny khng c h tr thc thi phng thc DrawWindow( ) cho ring n. Ghi ch: Khc vi ngn ng C++, trong C# phng thc Window.DrawWindow( ) khng th cung cp mt s thc thi, do chng ta s khng th ly c li ch ca phng thc
DrawWindow()
Cui cng nhng lp tru tng khng c s thc thi cn bn; chng th hin tng v mt s tru tng, iu ny thit lp mt s giao c cho tt c cc lp dn xut. Ni cch khc
cc lp tru tng m t mt phng thc chung ca tt c cc lp c thc thi mt cch tru tng. tng ca lp tru tng Windowth hin nhng thuc tnh chung cng vi nhng hnh vi ca tt c cc Window, thm ch ngay c khi ta khng c nh to th hin ca chnh lp tru tng Window. ngha ca mt lp tru tng c bao hm trong chnh t tru tng. Lp ny dng thc thi mt Window tru tng, v n s c biu l trong cc th hin xc nh ca Windows, nh l Button, ListBox, Frame,... Cc lp tru tng khng th thc thi c, ch c nhng lp xc thc tc l nhng lp dn xut t lp tru tng ny mi c th thc thi hay to th hin. Mt s thay i vic s dng tru tng l nh ngha mt giao din (interface), phn ny s c trnh by trong Chng 8 ni v giao din. Lp c lp (sealed class) Ngc vi cc lp tru tng l cc lp c lp. Mt lp tru tng c thit k cho cc lp dn xut v cung cp cc khun mu cho cc lp con theo sau. Trong khi mt lp c lp th khng cho php cc lp dn xut t n. khai bo mt lp c lp ta dng t kha sealed t trc khai bo ca lp khng cho php dn xut. Hu ht cc lp thng c nh du sealednhm ngn chn cc tai nn do s k tha gy ra. Nu khai bo ca lp Window trong v d 5.3 c thay i t kha abstract bng t kha sealed (cng c th loi b t kha trong khai bo ca phng thc DrawWindow()). Chng trnh s b li khi bin dch. Nu chng ta c th bin dch chng trnh th s nhn c li t trnh bin dch:
ListBoxcannotinheritfromsealedclassWindow
y ch l mt li trong s nhng li nh ta khng th to mt phng thc thnh vin protected trong mt lp khai bo l sealed.
Gc ca tt c cc lp: Lp Object
Tt c cc lp ca ngn ng C# ca bt c kiu d liu no th cng c dn xut t lp
System.Object.
Mt lp c s l cha trc tip ca mt lp dn xut. Lp dn xut ny cng c th lm c s cho cc lp dn xut xa hn na, vic dn xut ny s to ra mt cy tha k hay mt kin trc phn cp. Lp gc l lp nm trn cng cy phn cp tha k, cn cc lp dn xut th nm bn di. Trong ngn ng C#, lp gc l lp Object, lp ny
nm trn cng trong cy phn cp cc lp. Lp Objectcung cp mt s cc phng thc dng cho cc lp dn xut c th thc hin vic ph quyt. Nhng phng thc ny bao gm Equals() kim tra xem hai i tng c ging nhau hay khng. Phng thc GetType() tr v kiu ca i tng. V phng thc ToString
Phng thc
Equal() GetHashCode() GetType() ToString() Finalize() MemberwiseClone()
Chc nng So snh bng nhau gia hai i tng Cho php nhng i tng cung cp ring nhng p kibm chos tngtp hp. Cung chm u ca i dng Cung cp chui th hin ca i tng Dn dp cc ti nguyn To mt bn sao t i tng.
Bng 5.1: Tm tt cc phng thc ca lp Object. V d 5.4 sau minh ha vic s dng phng thc ToString( ) tha k t lp Object. V d 5.4: Tha k t Object. ----------------------------------------------------------------------------usingSystem; publicclassSomeClass { publicSomeClass(intval) { value=val; } //phquytphngthcToStringcalpObjectpublic virtualstringToString() { returnvalue.ToString(); } //binthnhvinprivatelugitrprivate intvalue; } publicclassTester { staticvoidMain() { inti=5; Console.WriteLine(Thevalueofiis:{0},i.ToString());SomeClass s= ne
wSomeClass(7);Console.WriteLine(Thevalueofsis{0}, s.ToString());
Console.WriteLine(Thevalueof5is{0},5.ToString()); } }
----------------------------------------------------------------------------Kt qu:
The value of i is: 5 The value of s is 7 The value of 5 is 5
y l phng thc o public, phng thc ny tr v mt chui v khng nhn tham s. T t c kiu d liu c xy dng sn, nh kiu int, dn xut t lp Objectnn n cng c th thc thi cc phng thc ca lp Object. Lp SomeClass trong v d trn thc hin vic ph quyt phng thc ToString(), do phng thc ny s tr v gi tr c ngha. Nu chng ta khng ph quyt phng thc ToString()trong lp SomeClass, phng thc ca lp c s s c thc thi, v kt qu xut ra s c thay i nh sau:
ThevalueofsisSomeClass
Nh chng ta thy, hnh vi mc nh tr v mt chui chnh l tn ca lp ang th hin. Cc lp khng cn phi khai bo tng minh vic dn xut t lp Object, vic k tha s c a vo mt cch ngm nh. Nh lp SomeClass trn ta khng khai bo bt c dn xut ca lp no nhng C# s t ng a lp Object thnh lp dn xut. Do ta mi c th ph quyt phng thc ToString()ca lp Object.
tng cn dng v sao chp gi tr trn vo i tng mi to. Ta c hnh v sau minh ha qu trnh Boxing mt s nguyn.
Stack
Heap
Int 123
Hnh 5.5: Boxing s nguyn. Boxing c thc hin ngm nh khi chng ta t mt kiu gi tr vo mt tham chiu ang ch i v gi tr s c a vo i tng mt cch t ng ngm nh. V d, nu chng ta gn mt kiu d liu c bn nh kiu nguyn int vo mt bin kiu Object (iu ny hon ton hp l v kiu int c dn xut t lp Object) th gi tr ny s c a vo bin Object, nh minh ha sau:
usingSystem; classBoxing { publicstaticvoidMain() { inti=123; Console.WriteLine(Theobjectvalue={0},i); } }
thc hin ngc li, unboxing, tc l a t mt i tng ra mt gi tr phi c thc hin mt cch tng minh. Chng ta phi thit lp theo hai bc sau:
Phi chc chn rng i tng boxing ng kiu gi tr a ra. Sao chp gi tr t th hin hay i tng vo bin ku gi tr.
Stack
i 123 int i= 123; o 123 object o=i; k 123 int k = (int)o;
Heap
iboxed
Int 123
Hnh 5.6: Unboxing sau khi thc hin Boxing. thc hin unboxing thnh cng, th i tng c unboxing phi c tham chiu n mt i tng, v i tng ny c to ra bng vic boxing mt gi tr cng vi kiu ca gi tr c a ra. Boxing v Unboxing c minh ha trong v d 5.5. V d 5.5: Boxing v Unboxing. ----------------------------------------------------------------------------usingSystem; publicclassUnboxingTest { publicstaticvoidMain() { inti=123; //Boxing objecto=i; // Un bo
xingphictngminhintk=(int)o; Console.WriteLine(k:{0},k);
} }
----------------------------------------------------------------------------V d 5.5 to mt s nguyn i v thc hin boxing ngm nh khi i c gn cho mt i tng o. Sau gi tr c unboxing mt cch tng minh v gn n mt bin nguyn intmi, v cui cng gi tr c hin th. Thng thng, chng ta s bao bc cc hot ng unboxing trong khi try, s c trnh by trong Chng 13. Nu mt i tng c Unboxing l null hay l tham chiu n mt i tng c kiu d liu khc, mt InvalidCastExceptions c pht sinh.
Cc lp lng nhau
Cc lp cha nhng thnh vin, v nhng thnh vin ny c th l mt lp khc c kiu do ngi dng nh ngha (user-defined type). Do vy, mt lp Button c th c mt thnh vin ca kiu Location, v kiu Location ny cha thnh vin ca kiu d liu
Point.
Cho n lc ny, cc lp c to ra ch dng cho cc lp bn ngoi, v chc nng ca cc lp nh l lp tr gip (helper class). Chng ta c th nh ngha mt lp tr gip bn trong cc lp ngoi (outer class). Cc lp c nh ngha bn trong gi l cc lp lng (nested class), v lp cha c gi n gin l lp ngoi. Nhng lp lng bn trong c li l c kh nng truy cp n tt c cc thnh vin ca lp ngoi. Mt phng thc ca lp lng c th truy cp n bin thnh vin private ca lp ngoi. Hn na, lp lng bn trong c th n i vi tt c cc lp khc, lp lng c th l private cho lp ngoi. Cui cng, mt lp lm lng bn trong l public v c truy cp bn trong phm vi ca lp ngoi. Nu mt lp Outer l lp ngoi, v lp Nested l lp public lng bn trong lp
Outer,
ngoi hnh ng t nhiu ging nh mt namespace hay mt phm vi. Ghi ch: i vi ngi lp trnh Java, lp lng nhau trong C# th ging nh nhng lp ni static (static inner) trong Java. Khng c s tng ng trong C# vi nhng lp ni
nonstatic(nonstatic inner) FractionArtisl
trong Java.
V d 5.6 sau s thm mt lp lng vo lp Fractiontn l FractionArtist. Chc nng ca lp v mt phn s ra mn hnh. Trong v d ny, vic v s c thay th bng s dng hm WriteLinexut ra mn hnh console. V d 5.6: S dng lp lng nhau. ----------------------------------------------------------------------------usingSystem;
usingSystem.Text;
publicclassFraction { publicFraction(intnumerator,intdenominator) { this.numerator=numerator; this.denominator=denominator; } publicoverridestringToString() { StringBuilders=newStringBuilder();s.AppendFormat({0}/ {1},numerator,denominator);returns.ToString(); } internalclassFractionArtist { publicvoidDraw(Fractionf) { Console.WriteLine(Drawingthenumerator{0},f.numerator); Console.WriteLine(Drawingthedenominator{0},f.denominator); } } //binthnhvinprivate privateintnumerator;private intdenominator; } publicclassTester { staticvoidMain() { Fractionf1=newFraction(3,4); Console.WriteLine(f1:{0},f1.ToString()); Fraction.FractionArtistfa=newFraction.FractionArtist(); fa.Draw(f1); } }
-----------------------------------------------------------------------------
Lp Fraction trn ni chung l khng c g thay i ngoi tr vic thm mt lp lng bn trong v lc i mt s phng thc khng thch hp trong v d ny. Lp lng bn trong
FractionArtistch f.denominator.
cung cp mt phng thc thnh vin duy nht, phng thc Draw(). iu
th v trong phng thc Draw() truy cp d liu thnh vin privatel f.numerator v Hai vin thnh vin private ny s khng cho php truy cp nu FractionArtistkhng phi l lp lng bn trong ca lp Fraction. Lu l trong hm Main() khi khai bo mt th hin ca lp lng bn trong, chng ta phi xc nhn tn ca lp bn ngoi, tc l lp Fraction:
Fraction.FractionArtist Fraction. fa=newFraction.FractionArtist();
Cu hi v tr li
Cu hi 1: C cn thit phi ch nh t kha overridetrong phng thc ph quyt ca lp dn xut hay khng? Tr li 1: C, chng ta phi khai bo r rng t kha override vi phng thc ph quyt phng thc o (ca lp c s ) bn trong lp dn xut. Cuhi 2: Lp tru tng l th no? C th to i tng cho lp tru tng hay khng? Tr li 2: Lp tru tng khng c s thc thi, cc phng thc ca n c to ra ch l hnh thc, tc l ch c khai bo, do vy phn nh ngha bt buc phi c thc hin cc lp dn xut t lp tru tng ny. Do ch l lp tru tng, khng c s thc thi nn chng ta khng th to th hin hay to i tng cho lp tru tng ny. Cuhi 3: C phi khi to mt lp th phi k tha t mt lp no khng? Tr li 3: Khng nht thit nh vy, tuy nhin trong C#, th tt c cc lp c to iu phi dn xut t lp Object. Cho d chng c c khai bo tng minh hay khng. Do Object l lp gc ca tt c cc lp c xy dng trong C#. Mt iu th v l cc kiu d liu gi tr nh kiu nguyn, thc, k t cng c dn xut t Object. Cuhi 4: Lp lng bn trong mt lp l nh th no? Tr li 4: Lp lng bn trong mt lp hay cn gi l lp ni c khai bo vi t kha internal, cha bn trong phm vi ca mt lp. Lp ni c th truy cp c cc thnh vin private ca lp m n cha bn trong Cuhi 5: C th k tha t mt lp c s c vit trong ngn ng khc ngn ng C#? Tr li 5: c, mt trong nhng c tnh ca .NET l cc lp c th k tha t cc lp c vit t ngn ng khc. Do vy, trong C# ta c th k tha mt lp c vit t ngn ng khc ca .NET. V nhng ngn ng khc cng c th k tha t cc lp C# m ta to ra.
Cu hi thm
Cuhi 1: S t bit ha c s dng trong C# thng qua tnh g? Cuhi 2: Khi nim a hnh l g? Khi no th cn s dng tnh a hnh? Cu hi 3: Hy xy dng cy phn cp cc lp i tng sau: Xe_Toyota, Xe_Dream, Xe_Spacy, Xe_BMW, Xe_Fiat, Xe_DuLich, Xe_May, Xe?
Cuhi 4: T kha new c s dng lm g trong cc lp? Cu hi 5: Mt phng thc o trong lp c s c nht thit phi c ph quyt trong lp dn xut hay khng? Cu hi 6: Lp tru tng c cn thit phi xy dng hay khng? Hy cho mt v d v mt lp tru tng cho mt s lp. Cu hi 7: Lp c lp l g? C th khai bo protected cho cc thnh vin ca n c khng? Cu hi 8: Lp Object cung cp nhng phng thc no m cc lp khc thng xuyn k tha s dng. Cuhi 9: Th no l boxing v unboxing? Hy cho bit hai v d v qu trnh ny?
Bi tp
Bi tp 1: Hy m rng v d trong chng xy dng thm cc i tng khc k tha lp Window nh: Label, TextBox, Scrollbar, toolbar, menu,... Bi tp2: Hy xy dng cc lp i tng trong cu hi 3, thit lp cc quan h k tha da trn cy k tha m bn xy dng. Mi i tng ch cn mt thuc tnh l myNane cho bit tn ca n (nh Xe_Toyota th myName l Toi la Toyota...). Cc i tng c phng thc Who() cho bit gi tr myName ca n. Hy thc thi s a hnh trn cc lp . Cui cng to mt lp Tester vi hm Main() to mt mng cc i tng Xe, a tng i tng c th vo mng i tng Xe, sau cho lp tng i tng trong mng n t gii thiu tn (bng cch gi hm Who() ca tng i tng). Bi tp 3: Xy dng cc lp i tng hnh hc nh: im, on thng, ng trn, hnh ch nht, hnh vung, tam gic, hnh bnh hnh, hnh thoi. Mi lp c cc thuc tnh ring xc nh c hnh v biu din ca n nh on thng th c im u, im cui.... Mi lp thc thi mt phng thc Draw() ph quyt Draw() ca lp c s gc ca cc hnh m n dn xut. Hy xy dng lp c s ca cc lp trn v thc thi a hnh vi phng thc Draw(). Sau to lp Tester cng vi hm Main() th nghim a hnh ging nh bi tp 2 trn. Bi tp 4: Chng trnh sau y c li. Hy sa li bin dch v chy chng trnh. Cho bit lnh no gy ra li. V nguyn nhn gy ra li? ----------------------------------------------------------------------------usingSystem; abstractpublicclassAnimal { publicAnimal(stringname)
{ this.name=name; }
//phngthctrutngminhhavic //atncaitngabstract publicvoidWho(); //binthnhvinprotected protectedstringname; } //lpDogdnxuttlpAnimalpublic classDog:Animal { //hmkhidnglyhaithams publicDog(stringname,stringcolor):base(name) { this.color=color; } //phquytphngthctrutngWho() publicoverridevoidWho() { Console.WriteLine(Gugu!Toila{0}comaulong{1},name,color); } //binprivatecalp privatestringcolor; } publicclassCat:Animal { //hmkhidnglyhaithams publicCat(stringname,intweight):base(name) { this.weight=weight; } //phquytphngthctrutngWho() publicoverridevoidWho() { Console.WriteLine(Meomeo!Toila{0}cannang{1},name,weight); } //binprivatecalp
privateintweight; } publicclassTester
-----------------------------------------------------------------------------
Chng 6
NP CHNG TON T
S dng t kha operator H tr ngn ng .NET khc S dng ton t Ton t so snh bng Ton t chuyn i Cu hi & bi tp
Hng thit k ca ngn ng C# l tt c cc lp do ngi dng nh ngha (user- defined classes) c tt c cc chc nng ca cc lp c xy dng sn. V d, gi s chng ta nh ngha mt lp th hin mt phn s. m bo rng lp ny c tt c cc chc nng tng t nh cc lp c xy dng sn, ngha l chng ta cho php thc hin cc php ton s hc trn cc th hin ca phn s chng ta (nh cc php ton cng phn s, nhn hai phn s,...) v chuyn i qua li gia phn s v kiu d liu xy dng sn nh kiu nguyn (int). D nhin l chng ta c th d dng thc hin cc ton t bng cch gi mt phng thc, tng t nh cu lnh sau:
FractiontheSum=firstFraction.Add(secondFraction);
Mc d cch thc hin ny khng sai nhng v trc quan th rt t khng c t nhin nh kiu d lu c xy dng sn. Cch thc hin sau s tt hn rt nhiu nu ta thit k c:
FractiontheSum=firstFraction+secondFraction;
Cch thc hin ny xem trc quan hn v ging vi cch thc hin ca cc lp c xy dng sn, ging nh khi thc hin php cng gia hai s nguyn int. Trong chng ny chng ta s tm hiu k thut thm cc ton t chun vo kiu d liu do ngi dng nh ngha. V chng ta s tm hiu cc ton t chuyn i chuyn i kiu d liu do ngi dng nh ngha mt cch tng minh hay ngm nh sang cc kiu d liu khc.
Trong ngn ng C#, cc ton t l cc phng thc tnh, gi tr tr v ca n th hin kt qu ca mt ton t v nhng tham s l cc ton hng. Khi chng ta to mt ton t cho mt
282
Np Chng Ton T
lp l chng ta thc vic np chng (overloaded) nhng ton t , cng ging nh l chng ta c th np chng bt c phng thc thnh vin no. Do , np chng ton t cng (+) chng ta c th vit nh sau:
publicstaticFractionoperator+(Fractionlhs,Fractionrhs)
Trong ton t trn ta c s qui c t tn ca tham s l lhsv rhs. Tham s tn lhsthay th cho left hand side tc l ton hng bn tri, tng t tham s tn rhsthay th cho right hand side tc l ton hng bn phi. C php ngn ng C# cho php np chng mt ton t bng cch vit t kha operator v theo sau l ton t c np chng. T kha operator l mt b sung phng thc (method operator). Nh vy, np chng ton t cng (+) chng ta c th vit operator+. Khi chng ta vit:
FractiontheSum=firstFraction+secondFraction;
Th ton t np chng + c thc hin, vi firstFraction c truyn vo nh l tham s u tin, v secondFraction c truyn vo nh l tham s th hai. Khi trnh bin dch gp biu thc:
firstFraction+secondFraction
Kt qu sau khi thc hin l mt i tng Fraction mi c tr v, trong trng hp ny php gn s c thc hin gn mt i tng Fractioncho theSum. Ghi ch: i vi ngi lp trnh C++, trong ngn ng C# khng th to c ton t nonstatic, v do vy nn ton t nh phn phi ly hai ton hng.
S dng ton t
Np chng ton t c th lm cho m ngun ca chng ta trc quan v nhng hnh ng ca lp m chng ta xy dng ging nh cc lp c xy dng sn. Tuy nhin,
vic np chng ton t cng c th lm cho m ngun phc tp mt cch kh qun l nu chng ta ph
v cch th hin thng thng s dng nhng ton t. Hn ch vic s dng ty tin cc np chng ton t bng nhng cch s dng mi v nhng cch c trng. V d, mc d chng ta c th hp dn bi vic s dng np chng ton t gia tng (+ +) trong lp Employee gi mt phng thc gia tng mc lng ca nhn vin, iu ny c th em li rt nhiu nhm ln cho cc lp client truy cp lp Employee. V bn trong ca lp cn c th c nhiu trng thuc tnh s khc, nh s tui, nm lm vic,...ta khng th dnh ton t gia tng duy nht cho thc tnh lng c. Cch tt nht l s dng np chng ton t mt cch hn ch, v ch s dng khi no ngha n r rng v ph hp vi cc ton t ca cc lp c xy dng sn. Khi thng thc hin vic np chng ton t so snh bng (==) kim tra hai i tng xem c bng nhau hay khng. Ngn ng C# nhn mnh rng nu chng ta thc hin np chng ton t bng, th chng ta phi np chng ton t nghch vi ton t bng l ton t khng bng (!=). Tng t, khi np chng ton t nh hn (<) th cng phi to ton t (>) theo tng cp. Cng nh ton t (>=) i tng ng vi ton t (<=). Theo sau l mt s lut c p dng thc hin np chng ton t: nh ngha nhng ton t trong kiu d liu gi tr, kiu do ngn ng xy dng sn. Cung cp nhng phng thc np chng ton t ch bn trong ca lp ni m nhng phng thc c nh ngha. S dng tn v nhng k hu qui c c m t trong Common Language Specification (CLS). S dng np chng ton t trong trng hp kt qu tr v ca ton t l tht s r rng. V d, nh thc hin ton t tr (-) gia mt gi tr Time vi mt gi tr Time khc l mt ton t c ngha. Tuy nhin, nu chng ta thc hin ton t or hay ton t and gia hai i tng Timeth kt qu hon ton khng c ngha g ht. Np chng ton t c tnh cht i xng. V d, nu chng ta np chng ton t bng (==) th cng phi np chng ton t khng bng (!=). Do khi thc hin ton t c tnh cht i xng th phi thc hin ton t i xng li nh: <vi >, <=vi >=. Phi cung cp cc phng thc thay th cho ton t c np chng. a s cc ngn ng iu khng h tr np chng ton t. V nguyn do ny nn chng ta phi thc thi cc phng thc th hai c cng chc nng vi cc ton t. Common Language Specification (CLS) i hi phi thc hin phng thc th hai tng ng. Bng 6.1 sau trnh by cc ton t cng vi biu tng ca ton t v cc tn ca phng thc thay th cc ton t.
Biu tng
+ *
/ % ^ & | && || = << >> == > < != >= <= *= = ^= <<= %= += &= |= /= ++ + ~
Divide Mod Xor BitwiseAnd BitwiseOr And Or Assign LeftShift RightShift Equals Compare Compare Compare Compare Compare Multiply Subtract Xor LeftShift Mod Add BitwiseAnd BitwiseOr Divide Decrement Increment Negate Plus OnesComplement
Ton t chia Ton t chia ly d Ton t orloi tr Ton t andnh phn Ton t ornh phn Ton t andlogic Ton t orlogic Ton t gn Ton t dch tri Ton t dch phi Ton t so snh bng Ton t so snh ln hn Ton t so snh nh hn Ton t so snh khng bng Ton t so snh ln hn hay bng t so snh nh hn hay Ton bng Ton t nhn ri gn tr li Ton t tr ri gn tr li Ton t orloi tr ri gn li Ton t dch tri ri gn li Ton t chia d ri gn li Ton t cng ri gn li Ton t andri gn li Ton t orri gn li Ton t chia ri gn Ton t gim Ton t tng Ton t ph nh mt ngi Ton t cng mt ngi Ton t b
chng ton t nhng h tr np chng phng thc. Nhng lp FCL khng s dng np chng ton t, nhng vn mong i lp ca chng ta thc hin nhng phng thc c bn ny. Do v d lp ArrayList mong mun chng ta thc thi phng thc Equals(). Lp objectthc thi phng thc Equals() vi khai bo sau:
publicoverrideboolEquals(object0)
Bng cch ph quyt phng thc ny, chng ta cho php lp Fractionhnh ng mt cch a hnh vi tt c nhng lp khc. Bn trong thn ca phng thc Equals() chng ta cn phi m bo rng chng ta ang so snh vi mt Fractionkhc, v nu nh chng ta thc thi mt ton t so snh bng th c th nh ngha phng thc Equals()nh sau:
pubicoverrideboolEquals(objecto) { if(!(oisFraction)) { returnfalse; } returnthis==(Fraction)o; }
Ton t isc s dng kim tra kiu ca i tng lc chy chng trnh c tng thch vi ton hng trong trng hp ny l Fraction. Do o l Fractionnn ton t iss tr v true.
Ton t chuyn i
C# cho php chuyn i t kiu int sang kiu long mt cch ngm nh, v cng cho php chng ta chuyn t kiu longsang kiu intmt cch tng minh. Vic chuyn t kiu
int sang
cng c thch hp vi kch thc ca kiu long. Tuy nhin, iu ngc li, tc l chuyn t kiu longsang kiu int phi c thc hin mt cch tng minh (s dng p kiu) bi v ta c th mt thng tin khi gi tr ca bin kiu long vt qu kch thc ca
intlu
trong b nh:
Chng ta mun thc hin vic chuyn i ny vi lp Fraction. Khi a ra mt s nguyn, chng ta c th h tr ngm nh chuyn i thnh mt phn s bi v bt k gi tr nguyn no ta cng c th chuyn thnh gi tr phn s vi mu s l 1
nh (24==24/1). Khi a ra mt phn s, chng ta mun cung cp mt s chuyn i tng minh tr li mt s nguyn, iu ny c th hiu l mt s thng tin s b mt. Do , khi chng ta chuyn phn s 9/4 thnh gi tr nguyn l 2.
T ng ngm nh (implicit) c s dng khi mt chuyn i m thnh cng m khng mt bt c thng tin no ca d liu nguyn thy. Trng hp ngc li, tng minh (explicit) khng m bo bo ton d liu sau khi chuyn i do vic ny s c thc hin mt cch cng khai. V d 6.1 s trnh by di y minh ha cch thc m chng ta c th thc thi chuyn i tng minh v ngm nh, v thc thi mt vi cc ton t ca lp Fraction. Trong v d ny chng ta s dng hm Console.WriteLine() xut thng ip ra mn hnh minh ha khi phng thc c thi hnh. Tuy nhin cch tt nht l chng ta s dng trnh bebug theo di tng bc thc thi cc lnh hay nhy vo tng phng thc c gi. V d 6.1: nh ngha cc chuyn i v ton t cho lp Fraction. ----------------------------------------------------------------------------usingSystem; publicclassFraction { publicFraction(intnumerator,intdenominator) { Console.WriteLine("InFractionConstructor(int,int)"); this.numerator=numerator; this.denominator=denominator; } publicFraction(intwholeNumber) { Console.WriLine("InFractionConstructor(int)"); numerator=wholeNumber; denominator=1; } publicstaticimplicitoperatorFraction(inttheInt) { Console.WriteLine("InimplicitconversiontoFraction"); returnnewFraction(theInt); } publicstaticexplicitoperatorint(FractiontheFraction) { Console.WriteLine("Inexplicitconversiontoint"); returntheFraction.numerator/theFraction.denominator;
} publicstaticbooloperator==(Fractionlhs,Fractionrhs) {
Console.WriteLine("Inoperator=="); if(lhs.numerator==rhs.numerator&& lhs.denominator==rhs.denominator) { returntrue; } //thchinkhihaiphnskhngbngnhaureturn false; } publicstaticbooloperator!=(Fractionlhs,Fractionrhs) { Console.WriteLine("Inoperator!="); return!(lhs==rhs); } publicoverrideboolEquals(objecto) { Console.WriteLine("InmethodEquals"); if(!(oisFraction)) { returnfalse; } returnthis==(Fraction)o; } publicstaticFractionoperator+(Fractionlhs,Fractionrhs) { Console.WriteLine("Inoperator+"); if(lhs.denominator==rhs.denominator) { returnnewFraction(lhs.numerator+rhs.numerator,lhs.denominator); } //thchinkhihaimuskhngbngnhau intfirstProduct=lhs.numerator*rhs.denominator; intsecondProduct=rhs.numerator*lhs.denominator;return newFraction(firstProduct+secondProduct,lhs.denominator*
rhs.denominator); } publicoverridestringToString() {
strings=numerator.ToString()+"/"+denominator.ToString(); returns; } //binthnhvinlutsvmusprivate intnumerator; privateintdenominator; } publicclassTester { staticvoidMain() { Fractionf1=newFraction(3,4); Console.WriteLine("f1:{0}",f1.ToString()); Fractionf2=newFraction(2,4); Console.WriteLine("f2:{0}",f2.ToString()); Fractionf3=f1+f2; Console.WriteLine("f1+f2=f3:{0}",f3.ToString()); Fractionf4=f3+5; Console.WriteLine("f4=f3+5:{0}",f4.ToString()); Fractionf5=newFraction(2,4); if(f5==f2) { Console.WriteLine("f5:{0}==f2:{1}", f5.ToString(),f2.ToString()); } } }
----------------------------------------------------------------------------Lp Fractionbt u vi hai hm khi dng: mt hm ly mt t s v mu s, cn hm kia ly ch ly mt s lm t s. Tip sau hai b khi dng l hai ton t chuyn i. Ton t chuyn i u tin chuyn mt s nguyn sang mt phn s:
publicstaticimplicitoperatorFraction(inttheInt) { returnnewFraction(theInt);
S chuyn i ny c thc hin mt cch ngm nh bi v bt c s nguyn no cng c th c chuyn thnh mt phn s bng cch thit lp t s bng gi tr s nguyn v mu s c gi tr l 1. Vic thc hin ny c th giao li cho phng thc khi dng ly mt tham s. Ton t chuyn i th hai c thc hin mt cch tng minh, chuyn t mt
Fractionra { returntheFraction.numerator/theFraction.denominator; }
mt s nguyn:
publicstaticexplicitoperatorint(FractiontheFraction)
Bi v trong v d ny s dng php chia nguyn, php chia ny s ct b phn phn ch ly phn nguyn. Do vy nu phn s c gi tr l 16/15 th kt qu s nguyn tr v l 1. Mt s cc php chuyn i tt hn bng cch s dng lm trn s. Tip theo sau l ton t so snh bng (==) v ton t so snh khng bng (!=). Chng ta nn nh rng khi thc thi ton t so snh bng th cng phi thc thi ton t so snh khng bng. Chng ta nh ngha gi tr bng nhau gia hai Fraction khi t s bng t s v mu s bng mu s. Vi d, nh hai phn s 3/4 v 6/8 th khng c so snh l bng nhau. Mt ln na, mt s thc thi tt hn l ti gin t s v mu s khi 6/8s n gin thnh
3/4
v khi so snh hai phn s s bng nhau. Trong lp ny chng ta cng thc thi ph quyt phng thc Equals()ca lp object, do i tng Fraction ca chng ta c th c i x mt cch a hnh vi bt c i tng khc. Trong phn thc thi ca phng thc chng ta y thc vic so snh li cho ton t so snh bng cch gi ton t (==). Lp Fraction c th thc thi ht tt c cc ton t s hc nh cng, tr, nhn, chia. Tuy nhin, trong phm vi nh hp ca minh ha chng ta ch thc thi ton t cng, v thm ch php cng y c thc hin n gin nht. Chng ta th nhn li, nu hai mu s bng nhau th ta cng t s:
publicstaticFractionoperator+(Fractionlhs,Fractionrhs) { if(lhs.denominator==rhs.denominator) { returnnewFraction(lhs.numerator+rhs.numerator,lhs.denominator);
} }
rhs.denominator);
Cui cng l s ph quyt phng thc ToString()ca lp object, phng thc mi ny thc hin vit xut ra ni dung ca phn s di dng : t s / mu s:
publicoverridestringToString() { strings=numerator.ToString()+/+denominator.ToString(); returns; }
Chng ta to mt chui mi bng cch gi phng thc ToString() ca numerator. Do numerator l mt i tng, nn trnh bin dch s ngm nh thc hin boxing s nguyn numerator v sau gi phng thc ToString(), tr v mt chui th hin gi tr ca s nguyn numerator. Sau ta ni chui vi / v cui cng l chui th hin gi tr ca mu s. Vi lp Fraction to ra, chng ta thc hin kim tra lp ny. u tin chng ta to ra hai phn s 3/4, v 2/4:
Fractionf1=newFraction(3,4); Console.WriteLine("f1:{0}",f1.ToString()); Fractionf2=newFraction(2,4); Console.WriteLine("f2:{0}",f2.ToString());
Do trong phng phc khi dng ca lp Fractionchng ta c gi hm WriteLine() xut ra thng tin b khi dng nn khi to i tng (new) th cng cc thng tin ny s c hn th. Dng tip theo trong hm Main()s gi ton t cng, y l phng thc tnh. Mc ch ca ton t ny l cng hai phn s v tr v mt phn s mi l tng ca hai phn s a vo:
Fractionf3=f1+f2; Console.WriteLine(f1+f2=f3:{0},f3.ToString());
InFractionConstructor(int,int) f1+f2=f3:5/4
Ton t + c gi trc sau n phng thc khi dng ca i tng f3. Phng thc khi dng ny ly hai tham s nguyn to t s v mu s ca phn s mi f3.
Hai cu lnh tip theo cng mt gi tr nguyn vo phn s f3v gn kt qu mi v cho phn s mi f4:
Fractionf4=f3+5; Console.WriteLine(f3+5=f4:{0},f4.ToString());
Ghi ch: rng ton t chuyn i ngm nh c gi khi chuyn 5 thnh mt phn s. Phn s c to ra t ton t chuyn i ngm nh ny gi phng thc khi dng mt tham s to phn s mi 5/1. Phn s mi ny s c chuyn thnh ton hng trong php cng vi phn s f3 v kt qu tr v l phn s f4 l tng ca hai phn s trn. Th nghim cui cng l to mt phn s mi f5, ri sau gi ton t np chng so snh bng kim tra xem hai phn s c bng nhau hay khng.
Cu hi v tr li
Cu hi 1: C phi khi xy dng cc lp chng ta ch cn dng np chng ton t vi cc chc nng tnh ton ? Tr li 1: ng l nh vy, vic thc hin np chng ton t rt t nhin v trc quan. Tuy nhin mt s ngn ng .NET nh VB.NET khng h tr vic np chng ton t nn, tt nht nu mun cho lp trong C# ca chng ta c th c gi t ngn ng khc khng h tr np chng ton t th nn xy dng cc phng thc tng ng thc hin cng chc nng nh: Add, Sub, Mul,.. Cuhi 2: Nhng iu lu no khi s dng np chng ton t trong mt lp? Tr li 2: Ni chung l khi no tht cn thit v t gy ra s nhm ln. V d nh ta xy dng lp Employee c nhiu thuc tnh s nh lng, thm nin, tui... Chng ta mun xy dng ton t ++ cho lng nhng c th lm nhm ln vi vic tng s nm cng tc, hay tng tui. Do vy vic s dng np chng ton t cng phi cn nhc trnh gy nhm ln. Tt nht l s dng trong lp c t thuc tnh s... Cuhi 3: Khi xy dng ton t so snh th c phi ch cn dng ton t so snh bng? Tr li 3: ng l nu cn dng ton t so snh no th chng ta c th ch to ra duy nht ton t so snh m thi. Tuy nhin, tt hn l chng ta cng nn xy dng thm ton t so snh khc nh: so snh khc, so snh nh hn, so snh ln hn...Vic ny s
Cu hi thm
Cu hi 1: Khi no s dng ton t chuyn i? Th no l chuyn i tng minh v chuyn i ngm nh? Cu hi 2: C th to ra k hin ton t ring ca ta v thc thi np chng ton t hay khng? Cuhi 3: C bao nhiu ton t m .NET quy nh? K hiu ca tng ton t?
Bi tp
Bi tp 1: Hy tip tc pht trin lp Fraction trong v d ca chng bng cch thm cc ton t khc nh tr, nhn, chia, so snh... Bi tp 2: Xy dng lp im trong khng gian hai chiu, vi cc ton t cng, tr, nhn, chia. Bi tp3: Tng t nh bi tp 2 nhng im nm trong khng gian 3 chiu. Bi tp4: Xy dng lp s phc (s o) vi cc php ton cng, tr, nhn, chia.
Chng 7
CU TRC
nh ngha mt cu trc To cu trc
Cu trc l mt kiu gi tr Gi b khi dng mc nh To cu trc khng gi new
Cu hi & bi tp
Cu trc l kiu d liu n gin do ngi dng nh ngha, kch thc nh dng thay th cho lp. Nhng cu trc th tng t nh lp cng cha cc phng thc, nhng thuc tnh, cc trng, cc ton t, cc kiu d liu lng bn trong v b ch mc (indexer). C mt s s khc nhau quan trng gia nhng lp v cu trc. V d, cu trc th khng h tr k tha v b hy ging nh kiu lp. Mt iu quan trng nht l trong khi lp l kiu d liu tham chiu, th cu trc l kiu d lu gi tr (Chng 3 tho lun v kiu d liu tham chiu v kiu d liu gi tr). Do cu trc thng dng th hin cc i tng khng i hi mt ng ngha tham chiu, hay mt lp nh m khi t vo trong stackth c li hn l t trong b nh heap. Mt s nhn xt c rt ra l chng ta ch nn s dng nhng cu trc ch vi nhng kiu d liu nh, v nhng hnh vi hay thuc tnh ca n ging nh cc kiu d liu c xy dng sn. Cu trc c hiu qu khi chng ta s dng chng trong mng b nh (Chng 9). Tuy nhin, cu trc s km hiu qu khi chng ta s dng dng tp hp (collections). Tp hp c xy dng hng ti cc kiu d liu tham chiu. Trong chng ny chng ta s tm hiu cc nh ngha v lm vic vi kiu cu trc v cch s dng b khi dng khi to nhng gi tr ca cu trc.
nh ngha mt cu trc
304
Cu Trc
305
Cu Trc
V d 7.1 sau minh ha cch to mt cu trc. Kiu Location th hin mt im trong khng gian hai chiu. Lu rng cu trc Location ny c khai bo chnh xc nh khi thc hin khai bo vi mt lp, ngoi tr vic s dng t kha struct. Ngoi ra cng lu rng hm khi dng ca Location ly hai s nguyn v gn nhng gi tr ca chng cho cc bin thnh vin, xv y. Ta xv yca Locationc khai bo nh l thuc tnh. V d 7.1 To mt cu trc. ----------------------------------------------------------------------------usingSystem; publicstructLocation { publicLocation(intxCoordinate,intyCoordinate) { xVal=xCoordinate; yVal=yCoordinate; } publicintx { get { returnxVal; } set { } } publicinty { get { } set { } xVal=value;
} return yVal;
yVal=value;
publicoverridestringToString() { return(String.Format({0},{1},xVal,yVal)); } //thuctnhprivatelutox,yprivate intxVal; privateintyVal; } publicclassTester { publicvoidmyFunc(Locationloc) { loc.x=50; loc.y=100; Console.WriteLine(Loc1location:{0},loc); } staticvoidMain() { Locationloc1=newLocation(200,300); Console.WriteLine(Loc1location:{0},loc1);Testert =newTester(); t.myFunc(loc1); Console.WriteLine(Loc1location:{0},loc1); } }
----------------------------------------------------------------------------Khng ging nh nhng lp, cu trc khng h tr vic tha k. Chng c tha k ngm nh t lp object (tng t nh tt c cc kiu d liu trong C#, bao gm cc kiu d liu xy dng sn) nhng khng th k tha t cc lp khc hay cu trc khc. Cu trc cng c ngm nh l sealed, iu ny c ngha l khng c lp no hay bt c cu trc no c th dn xut t n. Tuy nhin, cng ging nh cc lp, cu trc c th thc thi nhiu giao din. Sau y l mt s s khc nhau na l: Khng c b hy v b khi to mc nh ty chn: Nhng cu trc khng c b hy v cng khng c b khi to mc nh khng tham s ty chn. Nu chng ta khng cung cp bt c b khi to no th cu trc s c cung cp mt b khi to
mc nh, khi gi tr 0 s c thit lp cho tt c cc d liu thnh vin hay nhng gi tr mc nh tng ng cho tng kiu d liu (bng 4.2). Nu chng ta cung cp bt c b khi dng no th chng ta phi khi to tt c cc trng trong cu trc.
Khng cho php khi to: chng ta khng th khi to cc trng th hin (instance fields) trong cu trc, do on m ngun sau s khng hp l:
privateintxVal=20; privateintyVal=50;
mc d iu ny thc hin tt i vi lp. Cu trc c thit k hng ti n gin v gn nh. Trong khi cc d liu thnh vin private h tr vic che du d liu v s ng gi. Mt vi ngi lp trnh c cm gic rng iu ny ph hng cu trc. H to mt d liu thnh vin public, do vy n gin thc thi mt cu trc. Nhng ngi lp trnh khc c cm gic rng nhng thuc tnh cung cp mt giao din r rng, n gin v vic thc hin lp trnh tt i hi phi che du d liu thm ch vi d liu rt n gin. Chng ta s chn cch no, ni chung l ph thuc vo quan nm thit k ca tng ngi lp trnh. D chn cch no th ngn ng C# cng h tr c hai cch tip cn.
To cu trc
Chng ta to mt th hin ca cu trc bng cch s dng t kha new trong cu lnh gn, nh khi chng ta to mt i tng ca lp. Nh trong v d 7.1, lp Testerto mt th hin ca Locationnh sau:
Locationloc1=newLocation(200,300);
Cu trc l mt kiu gi tr
Phn nh ngha ca lp Tester trong v d 7.1 trn bao gm mt i tng Location l
loc1c
cu trc Location:
Locationloc1=newLocation(200,300);
D nhin l WriteLine ch i mt i tng, nhng Location l mt cu trc (mt kiu gi tr). Trnh bin dch s t ng boxing cu trc (cng ging nh trnh bin dch lm vi cc kiu d liu gi tr khc). Mt i tng sau khi boxing c truyn vo cho phng thc WriteLine(). Tip sau l phng thc ToString() c gi trn i tng boxing ny, do cu trc ngm nh k tha t lp object, v n cng c th p ng s a hnh, bng cch ph quyt cc phng thc nh bt c i tng no khc.
Loc1location200,300
Tuy nhin do cu trc l kiu gi tr, nn khi truyn vo trong mt hm, th chng ch truyn gi tr vo hm. Cng nh ta thy dng lnh k tip, khi mt i tng Location c
Khi phng thc myFunc() tr v cho hm gi ( Main()) v chng ta gi tip phng thc
WriteLine()mt ln
na th gi tr khng thay i:
Loc1location:200,300
Nh vy cu trc c truyn vo hm nh mt i tng gi tr, v mt bn sao s c to bn trong phng thc myFunc(). Nu chng ta th i khai bo ca Location l
classnh sau: publicclassLocation
Lc ny Locationl mt i tng tham chiu nn khi truyn vo phng thc myFunc()th vic gn gi tr mi cho xv yiu lm thay i i tng Location.
Gi b khi dng mc nh
Nh cp phn trc, nu chng ta khng to b khi dng th mt b khi dng mc nh ngm nh s c trnh bin dch to ra. Chng ta c th nhn thy iu ny nu b b khi dng to ra:
/*publicLocation(intxCoordinate,intyCoordinate) { xVal=xCoordinate; yVal=yCoordinate; } */
v ta thay dng lnh u tin trong hm Main()to Locationc hai tham s bng cu lnh to khng tham s nh sau:
//Locationloc1=newLocation(200,300) Location loc1=newLocation();
Bi v lc ny khng c phng thc khi dng no khai bo, mt phng thc khi dng ngm nh s c gi. Kt qu khi thc hin ging nh sau:
Loc1location0,0 InmyFuncloc:50,100 Loc1location:0,0
Ghi ch: i vi lp trnh vin C++ lu , trong ngn ng C#, t kha new khng phi lun lun to i tng trn b nh heap. Cc lp th c to ra trn heap, trong khi cc cu trc th c to trn stack. Ngoi ra, khi new c b qua (s bn tip trong phn sau), th b khi dng s khng c gi. Do ngn ng C# yu cu phi c php gn trc khi s dng, chng ta phi khi to tng minh tt c cc bin thnh vin trc khi s dng chng trong cu trc.
kt qu mt i tng Locationc to trn stack. Tuy nhin, ton t new gi b khi dng ca lp Location, khng ging nh vi mt lp, cu trc c th c to ra m khng cn phi gi ton t new. iu ny ging nh cc bin ca cc kiu d liu c xy dng sn (nh int, long, char,..) c to ra. V d 7.2 sau minh ha vic to mt cu trc khng s dng ton t new. Ghi ch: y l mt s khuyn co, trong v d sau chng ta minh ha cch to mt cu trc m khng phi s dng ton t newbi v c s khc nhau gia C# v ngn ng C++ v s khc nhau ny chnh l cch ngn ng C# i x vi nhng lp khc nhng cu trc. Tuy nhin, vic to mt cu trc m khng dng t kha news khng c li v c th to mt chng trnh kh hiu, tim n nhiu li, v kh duy tr. Chng trnh ha sau s khng c khuyn khch. V d 7.2: To mt cu trc m khng s dng new. ----------------------------------------------------------------------------usingSystem; publicstructLocation { publicLocation(intxCoordinate,intyCoordinate) { xVal=xCoordinate; yVal=yCoordinate; } publicintx { get { }
returnxVal;
set { xVal=value; } } publicinty { get { returnyVal; } set { } } publicoverridestringToString() { return(string.Format({0},{1},xVal,yVal)); } //binthnhvinlutax,ypublic intxVal; publicintyVal; } publicclassTester { staticvoidMain() { Locationloc1; loc1.xVal=100; loc1.yVal=250; Console.WriteLine(loc1); } } yVal=value;
----------------------------------------------------------------------------Trong v d 7.2 chng ta khi to bin thnh vin mt cch trc tip, trc khi gi bt c phng thc no ca loc1v trc khi truyn i tng cho phng thc WriteLine():
loc1.xVal=100;
loc2.yVal=250;
Mt khi m chng ta gn tt c cc gi tr ca cu trc, chng ta c th truy cp gi tr thng qua thuc tnh xv thuc tnh y:
staticvoidMain() { Locationloc1; //gnchobinthnhvin loc1.xVal=100; loc1.yVal=250; //sdngthuctnh loc1.x=300; loc1.y=400; Console.WriteLine(loc1); }
Hy cn thn vi vic s dng cc thuc tnh. Mc d cu trc cho php chng ta h tr ng gi bng vic thit lp thuc tnh private cho cc bin thnh vin. Tuy nhin bn thn thuc tnh tht s l phng thc thnh vin,v chng ta khng th gi bt c phng thc thnh vin no cho n khi chng ta khi to tt c cc bin thnh vin. Nh v d trn ta thit lp thuc tnh truy cp ca hai bin thnh vin xValv yVall public v chng ta phi khi to gi tr ca hai bin thnh vin ny bn ngoi ca cu trc, trc khi cc thuc tnh c s dng.
Cu hi v tr li
Cuhi 1: C s khc nhau gia cu trc v lp? Tr li 1: ng c mt s s khc nhau gia cu trc v lp. Nh cp trong l
thuyt th lp l kiu d liu tham chiu cn cu trc l kiu d liu gi tr. iu ny c xem l s khc nhau cn bn gia cu trc v lp. Ngoi ra cu trc cng khng cho php c hm hy v to b khi dng khng tham s tng minh. Cu trc cng khc lp l cu trc l
kiu c lp tng minh, tc l khng cho php k tha t n. V n cng khng k tha c t bt c lp no khc. Mc nhin, cc cu trc vn k tha t Object nh bt c kiu d liu gi tr no khc trong C#/. Cuhi 2: Trong hai dng mng v tp hp th li no cha cu trc tt hn? Tr li 2: Cu trc c hiu qu khi s dng trong mng hn l lu chng di dng tp hp. Dng tp hp tt vi kiu d liu tham chiu. Cuhi 3: Cu trc c lu tr u? Tr li 3: Cu trc nh cp l kiu d liu gi tr nn n c lu tr trn stack ca chng trnh. Ngc vi kiu tham chiu c t trn heap. Cuhi 4: Khi truyn cu trc cho mt phng thc th di hnh thc no? Tr li 4: Do l kiu gi tr nn khi truyn mt i tng cu trc cho mt phng thc th n c truyn di dng tham tr ch khng phi tham chiu. Cuhi 5: Vy lm th no truyn cu trc di dng tham chiu cho mt phng thc? Tr li 5: Cng ging nh truyn tham chiu mt kiu gi tr nh int, long, char. Ta khai bo kha ref cho cc tham s kiu cu trc. V khi gi phng thc th thm t kha ref vo trc i mc cu trc c truyn vo.
Cu hi thm
Cu hi 1: Chng ta c th khi to gi tr ban u cho cc bin thnh vin ca n nh bn di c khng? Nu khng c ti sao?
structmyStruct { privateintmNum=100; .... }
Cuhi 2: S khc nhau gia kiu d liu tham chiu v kiu d liu gi tr? Cuhi 3: S khc nhau gia b khi dng ca cu trc v b khi dng ca lp? Cu hi 4: C nht thit phi dng t kha new to i tng kiu cu trc hay khng? Nu khng th cn cch no khc na? Cu hi 5: Qu trnh boxing v unboxing c din ra vi mt i tng l kiu cu trc hay khng?
Bi tp
Bi tp 1: Chng trnh sau y c li. Hy sa li, bin dch, v chy chng trnh. on lnh no gy ra li? ----------------------------------------------------------------------------usingSystem;
structTheStruct {
publicintx; publicTheStruct() { x=10; } } classTestClass { publicstaticvoidstructtaker(TheStructs) { s.x=5; } publicstaticvoidMain() { TheStructa=newTheStruct(); a.x=1; structtaker(a);Console.WriteLine("a.x= {0}",a.x); } }
----------------------------------------------------------------------------Bi tp 2: Hy tnh kt qu bng tay m chng trnh sau xut ra. Sau bin dch v chy chng trnh i snh kt qu. ----------------------------------------------------------------------------usingSystem; classTheClass { publicintx; } structTheStruct { publicintx; } classTestClass {
publicstaticvoidstructtaker(TheStructs) {
s.x=5; } publicstaticvoidclasstaker(TheClassc) { c.x=5; } publicstaticvoidMain() { TheStructa=newTheStruct(); TheClassb=newTheClass();a.x= 1; b.x=1; structtaker(a); classtaker(b); Console.WriteLine("a.x={0}",a.x); Console.WriteLine("b.x={0}",b.x); } }
----------------------------------------------------------------------------Bi tp 3: Hy sa chng trnh trong bi tp 2 kt qu gi tr a.x ca i tng a c thay i khi ra khi hm structtaker(). Dng truyn tham chiu cho cu trc.
Chng 8
Truy cp phng thc giao din Gn i tng cho mt giao din Ton t is Ton t as Giao din i lp vi tru tng
Thc thi ph quyt giao din Thc thi giao din tng minh La chn th hin phng thc giao din n thnh vin
Cu hi & bi tp Giao din l rng buc, giao c m bo cho cc lp hay cc cu trc s thc hin mt iu g . Khi mt lp thc thi mt giao din, th lp ny bo cho cc thnh phn client bit rng lp ny c h tr cc phng thc, thuc tnh, s kin v cc ch mc khai bo trong giao din. Mt giao din a ra mt s thay th cho cc lp tru tng to ra cc s rng buc gia nhng lp v cc thnh phn client ca n. Nhng rng buc ny c khai bo bng cch s dng t kha interface, t kha ny khai bo mt kiu d liu tham chiu ng gi cc rng buc. Mt giao din th ging nh mt lp ch cha cc phng thc tru tng. Mt lp tru tng c dng lm lp c s cho mt h cc lp dn xut t n. Trong khi giao din l s trn ln vi cc cy k tha khc. 325
Thc Thi Giao Din
326
Thc Thi Giao Din
Khi mt lp thc thi mt giao din, lp ny phi thc thi tt c cc phng thc ca giao din. y l mt bt buc m cc lp phi thc hin. Trong chng ny chng ta s tho lun cch to, thc thi v s dng cc giao din. Ngoi ra chng ta cng s bn ti cch thc thi nhiu giao din cng vi cch kt hp v m rng giao din. V cui cng l cc minh ha dng kim tra khi mt lp thc thi mt giao din.
Phn thuc tnh chng ta s cp sau. Thnh phn b sung truy cp bao gm: public, private, protected, internal, v protectedinternal c ni n trong Chng 4, ngha tng t nh cc b sung truy cp ca lp. Theo sau t kha interface l tn ca giao din. Thng thng tn ca giao din c bt u vi t I hoa (iu ny khng bt buc nhng vic t tn nh vy rt r rng v d hiu, trnh nhm ln vi cc thnh phn khc). V d mt s giao din c tn nh sau:
IStorable, ICloneable,...
Danh sch c s l danh sch cc giao din m giao din ny m rng, phn ny s c trnh by trong phn thc thi nhiu giao din ca chng. Phn thn ca giao din chnh l phn thc thi giao din s c trnh by bn di. Gi s chng ta mun to mt giao din nhm m t nhng phng thc v thuc tnh ca mt lp cn thit lu tr v truy cp t mt c s d liu hay cc thnh phn lu tr d liu khc nh l mt tp tin. Chng ta quyt nh gi giao din ny l IStorage. Trong giao din ny chng ta xc nhn hai phng thc: Read()v Write(), khai bo ny s c xut hin trong phn thn ca giao din nh sau:
interfaceIStorable { voidRead(); voidWrite(object); }
c trong mt lp. V d, chng ta c th to mt lp tn l Document, lp ny lu tr cc d liu trong c s d liu, do chng ta quyt nh lp ny ny thc thi giao din
IStorable.
By gi trch nhim ca chng ta, vi vai tr l ngi xy dng lp Document phi cung cp mt thc thi c ngha thc s cho nhng phng thc ca giao din
IStorable.
Chng ta phi thc thi tt c cc phng thc ca giao din, nu khng trnh thi giao din IStorable.
V d 8.1: S dng mt giao din. ----------------------------------------------------------------------------usingSystem; //khaibogiaodin interfaceIStorable { //giaodinkhngkhaibobsungtruycp //phngthclpublicvkhngthcthivoid Read(); voidWrite(objectobj); intStatus { get; set; } } //tomtlpthcthigiaodinIStorablepublic classDocument:IStorable {
publicDocument(strings) { Console.WriteLine(Creatingdocumentwith:{0},s);
} //thcthiphngthcRead() publicvoidRead() { Console.WriteLine(ImplementtheReadMethodforIStorable); } //thcthiphngthcWritepublic voidWrite(objecto) { Console.WriteLine(ImpletingtheWriteMethodforIStorable); } //thcthithuctnh publicintStatus { get { returnstatus; } set { } } //lutrgitrthuctnh privateintstatus=0; } publicclassTester { staticvoidMain() { // truy cp phng thc trong i tng Document Document doc = new Document(Test Document); doc.Status=1; doc.Read(); Console .WriteLi ne(Doc ument Status: {0}, status=value;
isDoc.Read(); Console.WriteLine(IStorableStatus:{0},isDoc.Status); } }
----------------------------------------------------------------------------Kt qu:
Creating document with: Test Document Implementing the Read Method for IStorable Document Status: -1 Implementing the Read Method for IStorable IStorable Status: 0
----------------------------------------------------------------------------V d 8.1 nh ngha mt giao din IStorable vi hai phng thc Read(), Write() v mt thuc tnh tn l Status c kiu l s nguyn.. Lu rng trong phn khai bo thuc tnh khng c phn thc thi cho get()v set()m ch n gin l khai bo c hnh vi l get() v set():
intStatus{get;set;}
Ngoi ra phn nh ngha cc phng thc ca giao din khng c phn b sung truy cp (v d nh: public, protected, internal, private). Vic cung cp cc b sung truy cp s to ra mt li. Nhng phng thc ca giao din c ngm nh l public v giao din l nhng rng buc c s dng bi nhng lp khc. Chng ta khng th to mt th hin ca giao din, thay vo chng ta s to th hin ca lp c thc thi giao din. Mt lp thc thi giao din phi p ng y v chnh xc cc rng buc khai bo trong giao din. Lp Document phi cung cp c hai phng thc Read() v Write() cng vi thuc tnh Status. Tuy nhin cch thc hin nhng yu cu ny hon ton ph thuc vo lp Document. Mc d IStorage ch ra rng lp Document phi c mt thuc tnh l Statusnhng n khng bit hay cng khng quan tm n vic lp Document lu tr trng thi tht s ca cc bin thnh vin, hay vic tm kim trong c s d liu. Nhng chi tit ny ph thuc vo phn thc thi ca lp.
Do Document cng phi thc thi nhng phng thc c xc nhn trong giao din
ICompressible: publicvoidCompress() { Console.WriteLine(ImplementingtheCompressMethod); } publicvoidDecompress() { Console.WriteLine(ImplementingtheDecompressMethod); }
B sung thm phn khai bo giao din ICompressible v nh ngha cc phng thc ca giao din bn trong lp Document. Sau khi to th hin lp Document v gi cc phng thc t giao din ta c kt qu tng t nh sau:
Creatingdocumentwith:TestDocument ImplementingtheReadMethodforIStorable ImplementingCompress
Cc lp khc c th thc thi t do giao din ICompressible hay ILoggedCompressible ty thuc vo mc ch c cn thm chc nng hay khng. Nu mt lp thc thi giao din ILoggedCompressible, th lp ny phi thc thi tt c cc phng thc ca c hai giao din ICompressible v giao din ILoggedCompressible. Nhng i tng ca lp thc thi giao din ILoggedCompressible c th c gn cho c hai giao din
ILoggedCompressible v ICompressible.
Kt hp cc giao din
Mt cch tng t, chng ta c th to giao din mi bng cch kt hp cc giao din
c v ta c th thm cc phng thc hay cc thuc tnh cho giao din mi. V d, chng ta quyt nh to mt giao din IStorableCompressible. Giao din mi ny s kt hp nhng
phng thc ca c hai giao din v cng thm vo mt phng thc mi lu tr kch thc nguyn thu ca cc d liu trc khi nn:
interfaceIStorableCompressible:IStoreable,ILoggedCompressible { voidLogOriginalSize(); }
V d 8.2: Minh ha vic m rng v kt hp cc giao din. ----------------------------------------------------------------------------usingSystem; interfaceIStorable { voidRead(); voidWrite(objectobj); intStatus{get;set;} } //giaodinmiinterface ICompressible { voidCompress(); voidDecompress(); } //mrnggiaodin interfaceILoggedCompressible:ICompressible { voidLogSavedBytes(); } //kthpgiaodin interfaceIStorableCompressible:IStorable,ILoggedCompressible { voidLogOriginalSize(); } interfaceIEncryptable { voidEncrypt(); voidDecrypt(); }
publicclassDocument:IStorableCompressible,IEncryptable {
//bkhitolpDocumentlymtthamspublic Document(strings) { Console.WriteLine(Creatingdocumentwith:{0},s); } //thcthigiaodinIStorable publicvoidRead() { Console.WriteLine(ImplementingtheReadMethodforIStorable); } publicvoidWrite(objecto) { Console.WriteLine(ImplementingtheWriteMethodforIStorable); } publicintStatus { get { returnstatus; } set { } } //thcthiICompressible publicvoidCompress() { Console.WriteLine(ImplementingCompress); } publicvoidDecompress() { Console.WriteLine(ImplementingDecompress); } //thcthigiaodinILoggedCompressiblepublic status=value;
voidLogSavedBytes() { Console.WriteLine(ImplementingLogSavedBytes);
} //thcthigiaodinIStorableCompressiblepublic voidLogOriginalSize() { Console.WriteLine(ImplementingLogOriginalSize); } //thcthigiaodin publicvoidEncrypt() { Console.WriteLine(ImplementingEncrypt); } publicvoidDecrypt() { Console.WriteLine(ImplementingDecrypt); } //binthnhvinludliuchothuctnhprivate intstatus=0; } publicclassTester { publicstaticvoidMain() { //toitngdocument Documentdoc=newDocument(TestDocument); //gnitngchogiaodinIStorable isDoc=docasIStorable;if(isDoc!= null) { isDoc.Read(); } else { Console.WriteLine(IStorablenotsupported); } ICompressibleicDoc=docasICompressible;
if(icDoc!=null) { icDoc.Compress();
} else { Console.WriteLine(Compressiblenotsupported); } ILoggedCompressibleilcDoc=docasILoggedCompressible; if(ilcDoc!=null) { ilcDoc.LogSavedBytes(); ilcDoc.Compress(); //ilcDoc.Read();//khngthgic } else { Console.WriteLine(LoggedCompressiblenotsupported); } IStorableCompressibleisc=docasIStorableCompressible; if(isc!=null) { isc.LogOriginalSize(); isc.LogSavedBytes(); //IStorableCompressible //ILoggedCompressible
isc.Compress();//ICompress isc.Read(); } else { Console.WriteLine(StorableCompressiblenotsupported); } IEncryptableie=docasIEncryptable; if(ie!=null) { ie.Encrypt(); } else { Console.WriteLine(Encryptablenotsupported); //IStorable
} }
----------------------------------------------------------------------------Kt qu:
Creating document with: Test Document Implementing the Read Method for IStorable Implementing Compress Implementing LogSavedBytes Implementing Compress Implementing LogOriginalSize Implementing LogSaveBytes Implementing Compress Implementing the Read Method for IStorable Implementing Encrypt
----------------------------------------------------------------------------V d 8.2 bt u bng vic thc thi giao din IStorablev giao din ICompressible. Sau l phn m rng n giao din ILoggedCompressibleri sau kt hp c hai vo giao din
IStorableCompressible.
Chng trnh Tester to i tng Document mi v sau gn ln lt vo cc giao din khc nhau. Khi mt i tng c gn cho giao din ILoggedCompressible, chng ta c th dng giao din ny gi cc phng thc ca giao din ICompressible bi v ILoggedCompressiblem rng v tha k cc phng thc t giao din c s:
ILoggedCompressibleilcDoc=docasILoggedCompressible; if(ilcDoc!=null) { ilcDoc.LogSavedBytes(); ilcDoc.Compress(); //ilcDoc.Read();//khngthgic }
Tuy nhin, y chng ta khng th gi phng thc Read() bi v phng thc ny ca giao din IStorable, khng lin quan n giao din ny. Nu chng ta thm lnh ny vo th chng trnh s bin dch li. Nu chng ta gn vo giao din IStorableCompressible, do giao din ny kt hp hai giao din IStorable v giao din ICompressible, chng ta c th gi tt c nhng phng thc ca IStorableCompressible, ICompressible, v IStorable:
IStorableCompressibleisc=docasIStorableCompressible; if(isc!=null) {
isc.LogOriginalSize();
//IStorableCompressible
hay l ta c th to th hin ca giao din bng cch gn i tng Documentcho mt kiu d liu giao din, v sau s dng giao din ny truy cp cc phng thc:
IStorableisDoc=(IStorable)doc; isDoc.status=0; isDoc.Read();
Ghi ch: Cng nh ni trc y, chng ta khng th to th hin ca giao din mt cch trc tip.Do chng ta khng th thc hin nh sau:
IStorableisDoc=newIStorable();
Sau chng ta c th to th hin ca giao din bng cch gn i tng thc thi n kiu d liu giao din, trong trng hp ny l IStorable:
IStorableisDoc=(IStorable)doc;
Ni chung, cch thit k tt nht l quyt nh truy cp nhng phng thc ca giao din thng qua tham chiu ca giao din. Do vy cch tt nht l s dng isDoc.Read(), hn l s dng doc.Read() trong v d trc. Truy cp thng qua giao din cho php chng ta i x giao din mt cch a hnh. Ni cch khc, chng ta to hai hay nhiu hn nhng lp thc thi giao din, v sau bng cch truy cp lp ny ch thng qua giao din.
din giao din th hai, ICompressiblecho nhng i tng nn d liu v truyn qua mail nhanh chng:
interfaceICompressible {
voidCompress(); voidDecompress(); }
php gn cho ICompressible vn c bin dch bi v ICompressiblel mt giao din hp l. Tuy nhin, do php gn khng hp l nn khi chng trnh chy th s to ra mt ngoi l (exception):
AexceptionoftypeSystem.InvalidCastExceptionwasthrown.
Ton t is
Chng ta mun kim tra mt i tng xem n c h tr giao din, sau thc hin cc phng thc tng ng. Trong ngn ng C# c hai cch thc hin iu ny. Phng php u tin l s dng ton t is. C php ca ton t isl:
<biuthc>is<kiudliu>
Ton t is tr v gi tr true nu biu thc thng l kiu tham chiu c th c gn an ton n kiu d liu cn kim tra m khng pht sinh ra bt c ngoi l no. V d 8.3 minh ha vic s dng ton t is kim tra Document c thc thi giao din
IStorablehay ICompressible.
intStatus{get;set;} } //giaodinmi
interfaceICompressible { voidCompress(); voidDecompress(); } //DocumentthcthiIStorablepublic classDocument:IStorable { publicDocument(strings) { Console.WriteLine(Creatingdocumentwith:{0},s); } //IStorable publicvoidRead() { Console.WriteLine(ImplementingtheReadMethodforIStorable); } //IStorable.WriteLine() publicvoidWrite(objecto) { Console.WriteLine(ImplementingtheWriteMethodforIStorable); } //IStorable.Status publicintStatus { get { returnstatus; } set { } } //bienthanhvienluugiatricuathuoctinhStatusprivate status=value;
intstatus=0; } publicclassTester
{ staticvoidMain() { Documentdoc=newDocument(TestDocument); //chgnkhiantonif( docisIStorable) { IStorableisDoc=(IStorable)doc; isDoc.Read(); } //vickimtranyssaiif( docisICompressible) { ICompressibleicDoc=(ICompressible)doc; icDoc.Compress(); } } }
----------------------------------------------------------------------------Trong v d 8.3, hm Main() lc ny s thc hin vic gn vi interface khi c kim tra hp l. Vic kim tra ny c thc hin bi cu lnh if:
if(docisIStorable)
Biu thc iu kin s tr v gi tr truev php gn s c thc hin khi i tng c thc thi giao din bn phi ca ton t is. Tuy nhin, vic s dng ton t isa ra mt vic khng c hiu qu. hiu c iu ny, chng ta xem on chng trnh c bin dch ra m IL. y s c mt ngoi l nh, cc dng bn di l s dng h thp lc phn:
IL_0023:isinst IL_0028: IL_002a: IL_002b: IL_0030: IL_0031: brfalse.s ldloc.0 castclass stloc.2 ldloc.2 instancevoidICompressible::Compress() IL_0043 ICompressible ICompressible IL_0039
IL_0039:
ldstr
Compressiblenotsupported
iu quan trng xy ra l khi php kim tra ICompressible dng 23. T kha isinstl m MSIL tng ng vi ton t is. Nu vic kim tra i tng (doc) ng kiu ca kiu bn
phi. Th chng trnh s chuyn n dng lnh 2b thc hin tip v castclass c gi. iu khng may l castcall cng kim tra kiu ca i tng. Do vic kim tra s c thc hin hai ln. Gii php hiu qu hn l vic s dng ton t as.
Ton t as
Ton t as kt hp ton t is v php gn bng cch u tin kim tra hp l php gn (kim tra ton t is tr v true) ri sau php gn c thc hin. Nu php gn khng hp l (khi php gn tr gi tr false), th ton t astr v gi tr null. Ghi ch: T kha nullth hin mt tham chiu khng tham chiu n u c (null reference). i tng c gi tr nulltc l khng tham chiu n bt k i tng no. S dng ton t as loi b vic thc hin cc x l ngoi l. ng thi cng n trnh vic thc hin kim tra d tha hai ln. Do vy, vic s dng ti u ca php gn cho giao din l s dng as. C php s dng ton t asnh sau:
<biuthc>as<kiudliu>
on chng trnh sau thay th vic s dng ton t isbng ton t as v sau thc hin vic kim tra xem giao din c gn c nullhay khng:
staticvoidMain() { Documentdoc=newDocument(TestDocument); IStorableisDoc=docasIStorable; if(isDoc!=null) { isDoc.Read(); } else { Console.WriteLine(IStorablenotsupported); } ICompressibleicDoc=docasICompressible; if(icDoc!=null) { icDoc.Compress(); } else
{ Console.WriteLine(Compressiblenotsupported); }
Ta c th so snh on m IL sau vi on m IL s dng ton t is trc s thy on m sau c nhiu hiu qu hn:
IL_0023: IL_0028: IL_0029: IL_002a: IL_002c: isinst stloc.2 ldloc.2 brfalse.s ldloc.2 instancevoidICompressible::Compress() IL_0034 ICompressible
IL_002d: callvirt
Ghi ch: Nu mc ch ca chng ta l kim tra mt i tng c h tr mt giao din v sau l thc hin vic gn cho mt giao din, th cch tt nht l s dng ton t asl hiu qu nht. Tuy nhin, nu chng ta ch mun kim tra kiu d liu v khng thc hin php gn ngay lc . C l chng ta ch mun thc hin vic kim tra nhng khng thc hin vic gn, n gin l chng ta mun thm n vo danh sch nu chng thc s l mt giao din. Trong trng hp ny, s dng ton t isl cch la chn tt nht.
By gi lp Documentc th tha k t lp tru tng IStorable, v cng khng c g khc nhiu so vi vic s dng giao din. Tuy nhin, gi s chng ta mua mt lp List t mt hng th ba v chng ta mun kt hp vi lp c sn nh Storable. Trong ngn ng C++ chng ta c th to ra mt lp StorableList k tha t List v c Storable. Nhng trong ngn ng C# chng ta khng th lm c, chng ta khng th k tha t lp tru tng Storable v t lp List bi v trong C# khng cho php thc hin a k tha t nhng lp. Tuy nhin, ngn ng C# cho php chng ta thc thi bt c nhng giao din no v dn xut t mt lp c s. Do , bng cch lm cho Storable l mt giao din, chng ta c th k tha t lp Listv cng t IStorable. Ta c th to lp StorableListnh sau:
publicclassStorableList:List,IStorable { //phngthcList...
.....
V d 8.4: Ph quyt thc thi giao din. ----------------------------------------------------------------------------usingSystem; interfaceIStorable { voidRead(); voidWrite(); } //lpDocumentnginthcthigiaodinIStorablepublic classDocument:IStorable { //bkhidng publicDocument(strings) { Console.WriteLine(Creatingdocumentwith:{0},s); }
} //khngphiphngthco publicvoidWrite() { Console.WriteLine(DocumentWriteMethodforIStorable); } } //lpdnxuttDocumentpublic classNote:Document { publicNote(strings):base(s) { Console.WriteLine(Creatingnotewith:{0},s); } //phquytphngthcRead() publicoverridevoidRead() { Console.WriteLine(OverridingtheReadMethodforNote!); } //thcthimtphngthcWriteringcalppublic voidWrite() { Console.WriteLine(ImplementingtheWritemethodforNote!); } } publicclassTester { staticvoidMain() { //tomtitngDocument DocumenttheNote=newNote(TestNote); IStorableisNote=theNoteasIStorable; if(isNote!=null) { isNote.Read();
isNote.Write(); } Console.WriteLine(\n);
//trctipgiphngthc theNote.Read();theNote.Write(); Console.WriteLine(\n); //toitngNote Notenote2=newNote(SecondTest); IStorableisNote2=note2asIStorable; if(isNote!=null) { isNote2.Read(); isNote2.Write(); } Console.WriteLine(\n); //trctipgiphngthc note2.Read(); note2.Write(); } }
----------------------------------------------------------------------------Kt qu:
Creating document with: Test Note Creating note with: Test Note Overriding the Read method for Note! Document Write Method for IStorable Overriding the Read method for Note! Document Write Method for IStorable Creating document with: Second Test Creating note with: Second Test Overriding the Read method for Note! Document Write Method for IStorable Overriding the Read method for Note! Implementing the Write method for Note!
{ voidRead(); voidWrite(); }
Ngi thit k ca lp Document thc thi phng thc Read() l phng thc o nhng khng to phng thc Write()tng t nh vy:
publicvirtualvoidRead()
Trong ng dng th gii thc, chng ta cng nh du c hai phng thc ny l phng thc o. Tuy nhin trong v d ny chng ta minh ha vic ngi pht trin c th ty chn cc phng thc o ca giao din m lp thc thi. Mt lp mi Notedn xut t Document:
publicclassNote:Document
Vic ph quyt phng thc Read()trong lp Note l khng cn thit, nhng y ta t do lm iu ny:
publicoverridevoidRead()
Trong lp Tester, phng thc Read()v Write()c gi theo bn cch sau: Thng qua lp c s tham chiu n i tng ca lp dn xut Thng qua mt giao din to t lp c s tham chiu n i tng dn xut Thng qua mt i tng dn xut Thng qua giao din to t i tng dn xut Thc hin cch gi th nht, mt tham chiu Documentc to ra, v a ch ca mt i tng mi l lp dn xut Notec to trn heap v gn tr li cho i tng Document:
DocumenttheNote=newNote(TestNote);
Mt tham chiu giao din c to ra v ton t asc s dng gn Documentcho tham chiu giao din IStorable:
IStorableisNote=theNoteasIStorable;
Sau gi phng thc Read() v Write() thng qua giao din. Kt xut ca phng thc
Read()c
kt xut sau:
OverridingtheReadmethodforNote! DocumentWriteMethodforIStorable
OverridingtheReadmethodforNote! DocumentWriteMethodforIStorable
Trong trng hp ny, phng thc Read()ca lp Note c gi, v phng thc Write() ca lp Documentc gi. chng t rng kt qu ny ca phng thc ph quyt, chng ta tip tc to i tng Noteth hai v lc ny ta gn cho mt tham chiu Note. iu ny c s dng minh ha cho nhng trng hp cui cng (gi thng qua i tng dn xut v gi thng qua giao din c to t i tng dn xut):
Notenote2=newNote(SecondTest);
Mt ln na, khi chng ta gn cho mt tham chiu, phng thc ph quyt Read()c gi. Tuy nhin, khi nhng phng thc c gi trc tip t i tng Note:
note2.Read(); note2.Write();
kt qu cho ta thy rng cch phng thc ca Notec gi ch khng phi ca mt phng thc Document:
OverridingtheReadmethodforNote! ImplementingtheWritemethoddorNote!
thi.
Bi v c hai phng thc IStorable v ITalk c cng phng thc Read(),vic thc thi lp s dng thc thi tng minh cho mi phng thc. Vi vic thc thi tng minh, lp thc thi Documents khai bo tng minh cho mi phng thc:
voidITalk.Read();
iu ny s gii quyt vic tranh chp, nhng n s to ra hng lot cc hiu ng th v. u tin, khng cn thit s dng thc thi tng minh vi nhng phng thc khc ca Talk:
publicvoidTalk();
v khng c s tranh chp cho nn ta khai bo nh thng thng. iu quan trng l cc phng thc thc thi tng minh khng c b sung truy cp:
voidITalk.Read();
Tht vy, mt phng thc c khai bo tng minh th s khng c khai bo vi cc t kha b sung truy cp: abstract, virtual, override, v new. Mt u quan trng khc l chng ta khng th truy cp phng thc thc thi tng minh thng qua chnh i tng. Khi chng ta vit:
theDoc.Read();
Trnh bin dch ch hiu rng chng ta thc thi phng thc giao din ngm nh cho IStorable. Ch mt cch duy nht truy cp cc phng thc thc thi tng minh l thng qua vic gn cho giao din thc thi:
ITalkitDoc=theDocasITalk; if(itDoc!=null) { itDoc.Read(); }
S dng thc thi tng minh c p dng trong v d 8.5 V d 8.5: Thc thi tng minh. ----------------------------------------------------------------------------usingSystem; interfaceIStorable { voidRead(); voidWrite(); } interfaceITalk { voidTalk(); voidRead(); } //lpDocumentthcthihaigiaodinpublic classDocument:IStorable,ITalk { //bkhidng publicDocument(strings) { Console.WriteLine(Creatingdocumentwith:{0},s); } //tophngthcopublic virt
ualvoidRead() {
Console.WriteLine(ImplementingIStorable.Read); } //thcthibnhthng publicvoidWrite() { Console.WriteLine(ImplementingIStorable.Write); } //thcthitngminhvoid ITalk.Read() { Console.WriteLine(ImplementingITalk.Read); } publicvoidTalk() { Console.WriteLine(ImplementingITalk.Talk); } } publicclassTester { staticvoidMain() { //toitngDocument DocumenttheDoc=newDocument(TestDocument);IStorable isDoc=theDocasIStorable; if(isDoc!=null) { isDoc.Read(); } ITalkitDoc=theDocasITalk; if(itDoc!=null) { itDoc.Read(); } theDoc.Read(); theDoc.Talk();
} }
-----------------------------------------------------------------------------
Kt qu:
Creating document with: Test Document Implementing IStorable.Read Implementing ITalk.Read Implementing IStorable.Read Implementing ITalk.Talk
-----------------------------------------------------------------------------
nhng khng mun phng thc Read()v Write()l phn giao din public
ca lp Document. Chng ta c th s dng thc thi tng minh chc chn ch c th truy cp thng qua vic gn cho giao din. iu ny cho php chng ta lu tr ng ngha ca lp Document trong khi vn c th thc thi c giao din IStorable. Nu thnh phn client mun i tng thc thi giao din IStorable, n c th thc hin gn tng minh cho giao din gi cc phng thc thc thi giao din. Nhng khi s dng i tng Documentth ngha l khng c phng thc Read()v Write(). Tht vy, chng ta c th la chn th hin nhng phng thc thng qua thc thi tng minh, do chng ta c th trng by mt vi phng thc thc thi nh l mt phn ca lp Documentv mt s phng thc khc th khng. Trong v d 8.5, i tng Document trng by phng thc Talk() nh l phng thc ca lp
Document,
din. Thm ch nu IStorable khng c phng thc Read(), chng ta cng c th chn thc thi tng minh phng thc Read() phng thc khng c th hin ra bn ngoi nh cc phng thc ca Document. Chng ta lu rng v thc thi giao din tng minh ngn nga vic s dng t kha virtual, mt lp dn xut c th c h tr thc thi li phng thc. Do , nu Note dn xut t Document, n c th c thc thi li phng thc
Talk.Read() bi
n thnh vin
Ngn ng C# cho php n cc thnh vin ca giao din. V d, chng ta c mt giao din
IBasevi
mt thuc tnh P:
interfaceIBase
{ intP{get;set;} }
v sau chng ta dn xut t giao din ny ra mt giao din khc, IDerived, giao din mi ny lm n thuc tnh Pvi mt phng thc mi P():
interfaceIDerived:IBase { newintP(); }
Vic ci t ny l mt tng tt, by gi chng ta c th n thuc tnh Ptrong lp c s. Mt thc thi ca giao din dn xut ny i hi ti thiu mt thnh vin giao din tng minh. Chng ta c th s dng thc thi tng minh cho thuc tnh ca lp c s hoc ca phng thc dn xut, hoc chng ta c th s dng thc thi tng minh cho c hai. Do , ba phin bn c vit sau u hp l:
classmyClass:IDerived { //thcthitngminhchothuctnhcsint IBase.p{get{...}} //thcthingmnhphngthcdnxutpublic intP(){...} } classmyClass:IDerived { //thcthingmnhchothuctnhcspublic intP{get{...}} //thcthitngminhphngthcdnxutint IDerived.P(){...} } classmyClass:IDerived { //thcthitngminhchothuctnhcsint IBase.P{get{...}} //thcthitngminhphngthcdnxutint
IDerived.P(){...} }
Ni chung, vic truy cp nhng phng thc ca mt giao din thng qua vic gn cho giao din th thng c thch hn. Ngoi tr i vi kiu gi tr (nh cu trc) hoc vi cc lp khng cho dn xut (sealed class). Trong trng hp ny, cch u chung hn l gi phng thc giao din thng qua i tng. Khi chng ta thc thi mt giao din trong mt cu trc, l chng ta ang thc thi n trong mt kiu d liu gi tr. Khi chng ta gn cho mt tham chiu giao din, c mt boxing ngm nh ca i tng. Chng may khi chng ta s dng giao din b sung i tng, n l mt i tng boxing, khng phi l i tng nguyn thy cn c b sung. Xa hn na, nu chng ta thay i kiu d liu gi tr, th kiu d liu c boxing vn khng thay i. V d 8.6 to ra mt cu trc v thc thi mt giao din IStorable v minh ha vic boxing ngm nh khi gn mt cu trc cho mt tham chiu giao din. V d 8.6: Tham chiu n kiu d liu gi tr. ----------------------------------------------------------------------------usingSystem; //khaibomtgiaodinn interfaceIStorable { voidRead(); intStatus{get;set;} } //thcthithngquacutrcpublic structmyStruct:IStorable { publicvoidRead() { Console.WriteLine(ImplementingIStorable.Read); } publicintStatus { get { } set { }
} return status;
status=value;
//binthnhvinlugitrthuctnhStatus privateintstatus; } publicclassTester { staticvoidMain() { //tomtitngmyStruct myStructtheStruct=newmyStruct(); theStruct.Status=1;//khito Console.WriteLine(theStruct.Status:{0},theStruct.Status); //thayigitr theStruct.Status=2; Console.WriteLine(Changedobject); Console.WriteLine(theStruct.Status:{0},theStruct.Status); //gnchogiaodin //boxingngmnh IStorableisTemp=(IStorable)theStruct; //thitlpgitrthngquathamchiugiaodin isTemp.Status=4; Console.WriteLine(Changedinterface); Console.WriteLine(theStruct.Status:{0},isTemp:{1}, theStruct.Status,isTemp.Status); //thayigitrmtlnnatheStruct.Status =6;Console.WriteLine(Changedobject.); Console.WriteLine(theStruct.Status:{0},isTemp:{1}, theStruct.Status,isTemp.Status); } }
----------------------------------------------------------------------------Kt qu:
theStruct.Status: -1 Changed object. theStruct.Status: 2
C h a n g e
theStruct.Status: 6, isTemp: 4
----------------------------------------------------------------------------Trong v d 8.6, giao din IStorablec mt phng thc Read()v mt thuc tnh l Status. Giao din ny c thc thi bi mt cu trc tn l myStruct:
publicstructmyStruct:IStorable
on m ngun th v bn trong Tester. Chng ta bt u bng vic to mt th hin ca cu trc v khi to thuc tnh l 1, sau gi tr ca statusc in ra:0
myStructtheStruct=newmyStruct(); theStruct.Status=1;//khito Console.WriteLine(theStruct.Status:{0},theStruct.status);
K tip chng ta truy cp thuc tnh thay i status, mt ln na thng qua i tng gi tr:
//thayigitr theStruct.Status=2; Console.WriteLine(Changedobject); Console.WriteLine(theStruct.Status:{0},theStruct.Status);
kt qu ch ra s thay i:
Changedobject theStruct.Status:2
Ti im ny, chng ta to ra mt tham chiu n giao din IStorable, mt i tng gi tr theStruct c boxing ngm v gn li cho tham chiu giao din. Sau chng ta dng giao din thay i gi tr ca statusbng 4:
//gnchomtgiaodin //boxingngmnh IStorableisTemp=(IStorable)theStruct; //thitlpgitrthngquathamchiugiaodin isTemp.Status=4; Console.WriteLine(Changedinterface); Console.WriteLine(theStruct.Status:{0},isTemp:{1}, theStruct.Status,isTemp.Status);
2,isTemp:4
iu xy ra l: i tng c giao din tham chiu n thay i gi tr statusbng 4, nhng i tng gi tr cu trc khng thay i.Thm ch c nhiu th v hn khi chng ta truy cp phng thc thng qua bn thn i tng:
kt qu i tng gi tr thay i nhng i tng c boxing v c giao din tham chu khng thay i:
ChangedobjecttheStruct.Status:6, isTemp:4
V d 8.7: MSIL pht sinh t v d 8.6. ----------------------------------------------------------------------------methodprivatehidebysigstaticvoidMain()ilmanaged { .entrypoint //Codesize .maxstack .local 206(0xce) 4 ([0]valueclassmyStructtheStruct, [1]classIStorableisTemp, [2]int32V_2) IL_0000: IL_0002: IL_0008: IL_000a: IL_000b: IL_0010: IL_0015: IL_0017: IL_001c: IL_001d: IL_001f: IL_0024: ldloca.s iniobj ldloca.s ldc.i4.ml call ldstr ldloca.s call stloc.2 ldloca.s box call V_2 [mscorlib]System.Int32 void[mscorlib]System.Console::WriteLine I L _ instancevoidmyStruct::set_status(int32) theStruct.Status:{0} theStruct instanceint32myStruct::get_status() theStruct myStruct theStruct
002b: IL_002c:
(classSystem.String)
(classSystem.String,classSystem.Object) IL_0054: ldloca.s theStruct IL_0056: IL_005b: IL_005c: IL_005d: IL_005e: IL_0063: IL_0068: box stloc.1 ldloc.1 ldc.i4.4 callvirt ldstr call instancevoidIStorable::set_status(int32) Changedinterface void[mscorlib]System.Console::WriteLine theStruct.Status:{0},isTemp:{1} theStruct instanceint32mySystem::get_status() V_2 [mscorlib]System.Int32 instanceint32IStorable::get_status() V_2 [mscorlib]System.Int32 void[mscorlib]System.Console::WriteLine myStruct
(classSystem.String) IL_006d: ldstr IL_0072: IL_0074: IL_0079: IL_007a: IL_007c: IL_0081: IL_0082: IL_0087: IL_0088: IL_008a: IL_008f: ldloca.s call stloc.2 ldloca.s box ldloc.1 callvirt stloc.2 ldloca.s box call
(classSystem.String,classSystem.Object,classSystem.Object) IL_0094: IL_0096: IL_0097: ldloca.s ldc.i4.6 call ldstr IL_00a1: call instancevoidmyStruct::set_status(int32)IL_009c: Changedobject void[mscorlib]System.Console::WriteLine theStruct
(classSystem.String) IL_00a6: ldstr IL_00ab: IL_00ad: IL_00b2: IL_00b3: IL_00b5: IL_00ba: IL_00bb: IL_00c0: IL_00c1: IL_00c3: IL_00c8: ldloca.s call stloc.2 ldloca.s box ldloc.1 callvirt stloc.2 ldloca.s box call
}//endfomethodTester::Main
----------------------------------------------------------------------------Trong dng lnh IL_00b, gi tr ca status c thit lp thng qua vic gi i tng gi tr. Tip theo chng ta thy lnh gi th hai dng IL_0017. Lu rng vic gi WriteLine() dn n vic boxing mt gi tr nguyn phng thc GetStringca lp objectc gi. iu mun nhn mnh l dng lnh IL_0056 khi mt cu trc myStruct c boxing. Vic boxing ny to ra mt kiu d lu tham chiu cho tham chiu giao din. V iu quan trng l dng IL_005elc ny IStorable::set_statusc gi ch khng phi l myStruct::setStatus. iu quan trng mun trnh by y l khi chng ta thc thi mt giao din vi mt kiu gi tr, phi chc chn rng truy cp cc thnh vin ca giao din thng qua i tng hn l thng qua mt tham chiu giao din.
Cu hi v tr li
Cuhi 1: So snh gia lp v giao din? Tr li 1: Giao din khc vi lp mt s im sau: giao din khng cung cp bt c s thc thi m ngun no c. iu ny s c thc hin ti cc lp thc thi giao din. Mt giao din a ra ch ni rng c cung cp mt s s xc nhn hng dn cho nhng iu g xy ra v khng i vo chi tit. Mt iu khc na l tt c cc thnh vin ca giao din c gi s l public ngm nh. Nu chng ta c thay i thuc tnh truy cp ca thnh vin trong giao din th s nhn c li. Giao din ch cha nhng phng thc, thuc tnh, s kin, ch mc. V khng cha d
liu thnh vin, b khi dng, v b hy. Chng cng khng cha bt c thnh vin static no c.
Cuhi 2: S khc nhau gia giao din v lp tru tng? Tr li 2: S khc nhau c bn l s k tha. Mt lp c th k tha nhiu giao din cng mt lc, nhng khng th k tha nhiu hn mt lp tru tng. Cuhi 3: Cc lp thc thi giao din s phi lm g? Tr li 3: Cc lp thc thi giao din phi cung cp cc phn thc thi chi tit cho cc phng thc, thuc tnh, ch mc, s kin c khai bo trong giao din. Cuhi 4: C bao nhiu cch gi mt phng thc c khai bo trong giao din? Tr li 4: C 4 cch gi phng thc c khai bo trong giao din: Thng qua lp c s tham chiu n i tng ca lp dn xut Thng qua mt giao din to t lp c s tham chiu n i tng dn xut Thng qua mt i tng dn xut Thng qua giao din to t i tng dn xut Cuhi 5: Cc thnh vin ca giao din c th c nhng thuc tnh truy cp no? Tr li 5: Mc nh cc thnh vin ca giao din l public. V mc tiu ca giao din l xy dng cho cc lp khc s dng. Nu chng ta thay i thuc tnh ny nh l internal, protected hay private th s gy ra li. Cuhi 6: Chng ta c th to th hin ca giao din mt cch trc tip c khng? Tr li 6: Khng th to th hin ca giao din trc tip bng khai bo new c. Chng ta ch c th to th hin giao din thng qua mt php gn vi i tng thc thi giao din.
Cu hi thm
Cuhi 1: Ton t is c dng lm g trong giao din? Cu hi 2: Ton t as c li hn ton t is v mt no khi c s dng lin quan n giao din? Cuhi 3: Giao din l kiu d liu tham chiu hay kiu gi tr? Cu hi 4: Khi thc thi giao din vi cu trc. Th truy cp cc thnh vin ca giao din thng qua i tng hay thng qua tham chiu giao din l tt nht? Cuhi 5: S giao din c th c k tha cho mt lp? Cu hi 6: Vic thc thi giao din tng minh l thc thi nh th no? Trong trng hp no th cn thc hin tng minh?
Bi tp
Bi tp 1: Hy vit mt giao din khai bo mt thuc tnh ID cha chui gi tr. Vit mt lp Employee thc thi giao din . Bi tp 2: an m ngun sau y c li hy s li v hy cho bit ti sao c li ny. Sau khi sa li hy vit mt lp Circle thc thi giao din ny? -----------------------------------------------------------------------------
publicinterfaceIDimensions {
----------------------------------------------------------------------------Bi tp 3: Chng trnh sau y c li hy s li, bin dch v chy li chng trnh? Gii thch ti sao chng trnh c li. ----------------------------------------------------------------------------usingSystem; interfaceIPoint { //Propertysignatures: intx { get; set; } inty { get; set; } } classMyPoint:IPoint { //Fields: privateintmyX; privateintmyY; //Constructor: publicMyPoint(intx,inty) { myX=x; myY=y;
} //Propertyimplementation: publicintx
{ get { returnmyX; } set { } } publicinty { get { returnmyY; } set { } } } classMainClass { privatestaticvoidPrintPoint(IPointp) { Console.WriteLine("x={0},y={1}",p.x,p.y); } publicstaticvoidMain() { MyPointp=newMyPoint(2,3); Console.Write("MyPoint:"); PrintPoint(p); IPointp2=newIPoint(); myY=value; myX=value;
PrintPoint(p2); } }
-----------------------------------------------------------------------------
Bi tp 4: Xy dng mt giao din IDisplay c khai bo thuc tnh Name kiu chui. Hy vit hai lp Dog v Cat thc thi giao din IDisplay, cho bit thuc tnh Name l tn ca i tng.
Chng 9
MNG, CH MC, V TP HP
Mng
Khai bo mng Gi tr mc nh Truy cp cc thnh phn trong mng Khi to thnh phn trong mng S dng t kha params
B ch mc
B ch mc v php gn S dng kiu ch s khc
Giao din tp hp
Cu hi & bi tp
Mi trng .NET cung cp rt a dng s lng cc lp v tp hp, bao gm: Array,
ArrayList, Queue, Stack, BitArray, NameValueCollection,
v StringCollection.
Trong s tp hp n gin nht l Array, y l kiu d liu tp hp m ngn ng C# h tr xy dng sn. Chng ny chng ta s tm hiu cch lm vic vi mng mt chiu, mng a chiu, v mng cc mng (jagged array). Chng ta cng c gii thiu phn ch mc indexer, y l cch thit lp lm cho vic truy cp nhng thuc 396
Mng, Ch Mc, v Tp Hp
397
Mng, Ch Mc, v Tp Hp
.NET cng cung cp nhiu cc giao din, nh IEnumerable v ICollection. Nhng phn thc thi ca cc giao din ny cung cp cc tiu chun tng tc vi cc tp hp. Trong chng ny chng ta s c cch s dng hiu qu ca cc giao din. Cng thng qua chng ny chng ta s c gii thiu cch s dng chung ca cc tp hp trong .NET, bao gm: ArrayList, Dictionary, Hashtable, Queue, v Stack.
Mng
Mng l mt tp hp c th t ca nhng i tng, tt c cc i tng ny cng mt kiu. Mng trong ngn ng C# c mt vi s khc bit so vi mng trong ngn ng C++ v mt s ngn ng khc, bi v chng l nhng i tng. iu ny s cung cp cho mng s dng cc phng thc v nhng thuc tnh. Ngn ng C# cung cp c php chun cho vic khai bo nhng i tng Array. Tuy nhin, ci tht s c to ra l i tng ca kiu System.Array. Mng trong ngn ng C# kt hp c php khai bo mng theo kiu ngn ng C v kt hp vi nh ngha lp do th hin ca mng c th truy cp nhng phng thc v thuc tnh ca System.Array. Mt s cc thuc tnh v phng thc ca lp System.Array Thnh vin
BinarySearch() Clear() Copy() CreateInstance() IndexOf() LastIndexOf() Reverse() Sort() IsFixedSize IsReadOnly
M t Phng thc tnh public tm kim mt mng mt chiu sp th tth.c tnh public thit lp cc thnh phn ca mng Phng v 0 hay null. Phng thc tnh public np chng thc hin sao chp mt vng ca tnhng vo npkhc. to mt th hin Phng thc m public mng chng mi cho mng c tnh public tr v ch mc ca th hin u Phng th tin cha gi tr trong mng mt vu ch mc ca th hin Phng thc tnh publictr chi cui cng cathctr trong mng mt t ca cc thnh phn trong Phng gi tnh publico th chiu mng mt chiu Phng thc tnh publicsp xp gi tr trong mng mt chiu. tnh public gi tr bool th hin mng c kch thc Thuc c nh hay khng. Thuc tnh publicgi tr boolth hin mng ch c hay khng
IsSynchronized Length Rank SyncRoot GetEnumerator() GetLength() GetLowerBound() GetUpperBound() Initialize() SetValue()
Thuc tnh publicgi tr boolth hin mng c h tr thread-safe Thuc tnh publicchiu di ca mng Thuc tnh publiccha s chiu ca mng Thuc tnh public cha i tng dng ng b truy cp trong mng Phng thc publictr v IEnumerator Phng thc public tr v kch thc ca mt chiu c nh trong mthc public tr v cn di ca chiu xc nh Phng ng trong mng thc public tr v cn trn ca chiu xc nh trong Phng mng Khi to tt c gi tr trong mng kiu gi tr bng cch gi b khi dng public thitca tng tr cho. mt thnh phn xc Phng thc mc nh lp gi gi tr
Khai bo mng
Chng ta c th khai bo mt mng trong C# vi c php theo sau:
<kiudliu>[]<tnmng>
V d ta c khai bo nh sau:
int[] myIntArray;
Cp du ngoc vung ([]) bo cho trnh bin dch bit rng chng ta ang khai bo mt mng. Kiu d liu l kiu ca cc thnh phn cha bn trong mng. Trong v d bn trn. myIntArrayc khai bo l mng s nguyn. Chng ta to th hin ca mng bng cch s dng t kha newnh sau:
myIntArray=newint[6];
Khai bo ny s thit lp bn trong b nh mt mng cha su s nguyn. Ghi ch: dnh cho lp trnh vin Visual Basic, thnh phn u tin lun bt u 0, khng c cch no thit lp cn trn v cn di ca mng, v chng ta cng khng th thit lp li kch thc ca mng. iu quan trng phn bit gia bn thn mng (tp hp cc thnh phn) v cc thnh phn trong mng. i tng myIntArray l mt mng, thnh phn l nm s nguyn c lu gi. Mng trong ngn ng C# l kiu d liu tham chiu, c to ra trn heap. Do myIntArray c cp trn heap. Nhng thnh phn ca mng c cp pht da trn cc kiu
myIntArrayl kiu d liu gi tr, khng phi s nguyn c boxing. Mt mng ca kiu d liu tham chiu s khng cha g c nhng tham chiu n nhng thnh phn c to ra trn heap.
Gi tr mc nh
Khi chng ta to mt mng c kiu d liu gi tr, mi thnh phn s cha gi tr mc nh ca kiu d liu (xem bng 4.2, kiu d liu v cc gi tr mc nh). Vi khai bo:
myIntArray=newint[5];
s to ra mt mng nm s nguyn, v mi thnh phn c thit lp gi tr mc nh l 0, y cng l gi tr mc nh ca s nguyn. Khng ging vi mng kiu d liu gi tr, nhng kiu tham chiu trong mt mng khng c khi to gi tr mc nh. Thay vo , chng s c khi to gi tr null. Nu chng ta c truy cp n mt thnh phn trong mng kiu d liu tham chiu trc khi chng c khi to gi tr xc nh, chng ta s to ra mt ngoi l. Gi s chng ta to ra mt lp Button. Chng ta khai bo mt mng cc i tng Buttonvi c php sau:
Button[] myButtonArray;
Khng ging vi v d mng s nguyn trc, cu lnh ny khng tao ra mt mng vi nhng tham chiu n ba i tng Button. Thay vo vic ny s to ra mt mng myButtonArrayvi ba tham chiu null. s dng mng ny, u tin chng ta phi to v gn i tng Button cho tng thnh phn tham chiu trong mng. Chng ta c th to i tng trong vng lp v sau gn tng i tng vo trong mng.
V d 9.1: lm vic vi mt mng. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //tomtlpnginlutrtrongmngpublic classEmployee { //bkhitolymtthamspublic Employee(intempID) { this.empID=empID; } publicoverridestringToString() { returnempID.ToString(); } //binthnhvinprivate privateintempID; privateintsize; } publicclassTester { staticvoidMain() { int[]intArray;Employee[] empArray;intArray=new int[5]; empArray=newEmployee[3]; //toitngavomng for(inti=0;i<empArray.Length;i++) { empArray[i]=newEmployee(i+5); } //xutmngnguyn
for(inti=0;i<intArray.Length;i++) { Console.Write(intArray[i].ToString()+\t);
----------------------------------------------------------------------------Kt qu:
0 0 0 0 0 5 6 7
----------------------------------------------------------------------------V d bt u vi vic nh ngha mt lp Employee, lp ny thc thi mt b khi dng ly mt tham s nguyn. Phng thc ToString()c k tha t lp Objectc ph quyt in ra gi tr empIDca i tng Employee. Cc kiu to ra l khai bo ri mi to th hin ca hai mng. Mng s nguyn c t ng thit lp gi tr 0 mc nh cho tng s nguyn trong mng. Ni dung ca mng
Employeec to
Cui cng, ni dung ca c hai mng c xut ra mn hnh console m bo kt qu nh mong mun; nm gi tr u ca mng nguyn, ba s sau cng l ca mng Employee.
Khng c s khc bit gia hai c php trn, v hu ht cc chng trnh u s dng c php ngn hn do s t nhin v li nh nhiu lnh ca ngi lp trnh.
publicvoidDisplayVals(paramsint[]intVals)
Phng thc c th xem mng ny nh th mt mng c to ra tng minh v c truyn vo tham s. Sau chng ta c th t do lp ln lt qua cc thnh phn trong mng ging nh thc hin vi bt c mng nguyn no khc:
foreach(intiinintVals) { Console.WriteLine(DisplayVals:{0},i); }
Tuy nhin, phng thc gi khng cn thit phi to tng minh mt mng, n ch n gin truyn vo cc s nguyn, v trnh bin dch s kt hp nhng tham s ny vo trong mt mng cho phng thc DisplayVals, ta c th gi phng thc nh sau:
t.DisplayVals(5,6,7,8);
v chng ta c th t do to mt mng truyn vo phng thc nu mun: int[]explicitArray=newint[5]{1,2,3,4,5};t.DisplayArray(explicitArray); V d 9.3 cung cp tt c m ngun minh ha s dng c php params. V d 9.3: minh ha s dng params. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTester { staticvoidMain() { Testert=newTester(); t.DisplayVals(5,6,7,8); int[]explicitArray=newint[5]{1,2,3,4,5}; t.DisplayVals(explicitArray); } publicvoidDisplayVals(paramsint[]intVals) { foreach(intiinintVals) { } } } Console.WriteLine(DisplayVals{0},i); }
----------------------------------------------------------------------------Kt qu:
DisplayVals 5 DisplayVals 6 DisplayVals 7 DisplayVals 8 DisplayVals 1 DisplayVals 2 DisplayVals 3 DisplayVals 4 DisplayVals 5
-----------------------------------------------------------------------------
Cu lnh lp foreach
Cu lnh lp foreach kh mi vi nhng ngi hc ngn ng C, t kha ny c s dng trong ngn ng Visual Basic. Cu lnh foreach cho php chng ta lp qua tt c cc mc trong mt mng hay trong mt tp hp. C php s dng lnh lp foreachnh sau:
foreach(<kiudliuthnhphn><tntruycp>in<mng/tphp>) { //thchinthngqua<tntruycp>tngngvi //tngmctrongmnghaytphp }
Do vy, chng ta c th ci tin v d 9.1 trc bng cch thay vic s dng vng lp
for
bng vng lp foreach truy cp n tng thnh phn trong mng. V d 9.2: S dng foreach. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //tomtlpnginlutrtrongmngpublic classEmployee { //bkhitolymtthamspublic Employee(intempID) {
this.empID=empID; }
publicoverridestringToString() { returnempID.ToString(); } //binthnhvinprivate privateintempID; privateintsize; } publicclassTester { staticvoidMain() { int[]intArray;Employee[] empArray;intArray=new int[5]; empArray=newEmployee[3]; //toitngavomng for(inti=0;i<empArray.Length;i++) { empArray[i]=newEmployee(i+10); } //xutmngnguynforeach (intiinintArray) { Console.Write(i.ToString()+\t); } //xutmngEmployee foreach(EmployeeeinempArray) { Console.WriteLine(e.ToString()+\t); } } } }
-----------------------------------------------------------------------------
ta phi xc nh kch thc ca mng, s dng bin m tm thi truy cp n tng thnh phn trong mng:
for(inti=0;i<empArray.Length;i++) { Console.WriteLine(empArray[i].ToString()); }
Thay vo ta s dng foreach, khi vng lp s t ng trch ra tng mc tun t trong mng v gn tm vo mt tham chiu i tng khai bo u vng lp:
foreach(EmployeeeinempArray) { Console.WriteLine(e.ToString()+\t); }
i tng c trch t mng c kiu d liu tng ng. Do chng ta c th s dng bt c thnh vin publicca i tng.
Mng a chiu
T u chng n gi chng ta ch ni n mng cc s nguyn hay mng cc i tng. Tt c cc mng ny u l mng mt chiu. Mng mt chiu trong cc thnh phn ca n ch n gin l cc i tng kiu gi tr hay i tng tham chiu. Mng c th c t chc phc tp hn trong mi thnh phn l mt mng khc, vic t chc ny gi l mng a chiu. Mng hai chiu c t chc thnh cc dng v ct, trong cc dng l c tnh theo hng ngang ca mng, v cc ct c tnh theo hng dc ca mng. Mng ba chiu cng c th c to ra nhng thng t s dng do kh hnh dung. Trong mng ba chiu nhng dng by gi l cc mng hai chiu. Ngn ng C# h tr hai kiu mng a chiu l: Mng a chiu cng kch thc: trong mng ny mi dng trong mng c cng kch thc vi nhau. Mng ny c th l hai hay nhiu hn hai chiu. Mng a chiu khng cng kch thc: trong mng ny cc dng c th khng cng kch thc vi nhau.
V d khai bo mt mng hai chiu c tn l myRectangularArray cha hai dng v ba ct cc s nguyn, chng ta c th vit nh sau:
int[,]myRectangularArray;
V d tip sau y minh ha vic khai bo, to th hin, khi to v in ni dung ra mn hnh ca mt mng hai chiu. Trong v d ny, vng lp for c s dng khi to cc thnh phn trong mng. V d 9.4: Mng hai chiu. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTester { staticvoidMain() { //khaibosdngvsctcamngconst introws=4; constintcolumns=3; //khaibomng4x3snguyn int[,]rectangularArray=newint[rows,columns]; //khitoccthnhphntrongmngfor(inti =0;i<rows;i++) { for(intj=0;j<columns;j++) { rectangularArray[i,j]=i+j; } } //xutnidungramnhnh for(inti=0;i<rows;i++) { for(intj=0;j<columns;j++) { Console.WriteLine(rectangularArray[{0},{1}]={2}, i,j,rectangularArray[i,j]); } }
} } }
----------------------------------------------------------------------------Kt qu:
rectangularArray[0,0] = 0 rectangularArray[0,1] = 1 rectangularArray[0,2] = 2 rectangularArray[1,0] = 1 rectangularArray[1,1] = 2 rectangularArray[1,2] = 3 rectangularArray[2,0] = 2 rectangularArray[2,1] = 3 rectangularArray[2,2] = 4 rectangularArray[3,0] = 3 rectangularArray[3,1] = 4 rectangularArray[3,2] = 5
Lu trong c php ny, du ngoc vung trong int[,] ch ra rng ang khai bo mt kiu d liu l mng s nguyn, v du phy (,) ch ra rng y l mng hai chiu (hai du phy khai bo mng ba chiu, v nhiu hn na). Vic to th hin thc s ca mng lnh newint [rows,columns] thit lp kch thc ca mi chiu. y khai bo v to th hin c kt hp vi nhau. Chng trnh khi to tt c cc gi tr cc thnh phn trong mng thng qua hai vng lp for. Lp thng qua mi ct ca mi dng. Do , thnh phn u tin c khi thc to hin l rectangularArray[0,0], tip dng tip tip tc: theo bi rectangularArray[0,1] v n
rectangularArray[0,2]. Mt rectangularArray[1,2].Cho
n khi tt
c cc ct trong tt c cc dng c duyt qua tc l tt c cc thnh phn trong mng c khi to. Nh chng ta bit, chng ta c th khi to mng mt chiu bng cch s dng danh sch cc gi tr bn trong du ngoc ({}). Chng ta cng c th lm tng t vi mng hai chiu. Trong v d 9.5 khai bo mng hai chiu rectangularArray, v khi to cc thnh phn ca n thng qua cc danh sch cc gi tr trong ngoc, sau in ra ni dung ca ni
namespaceProgramming_CSharp { usingSystem; publicclassTester { staticvoidMain() { //khaibobinlusdngsctmngconst introws=4; constintcolumns=3; //khaibovnhnghamng4x3 int[,]rectangularArray={ {0,1,2},{3,4,5},{6,7,8},{9,10,11} }; //xtnidungcamngfor(int i=0;i<rows;i++) { for(intj=0;j<columns;j++) { Console.WriteLine(rectangularArray[{0},{1}]={2}, i,j,rectangularArray[i,j]); } } } } }
----------------------------------------------------------------------------Kt qu:
rectangularArray[0,0] = 0 rectangularArray[0,1] = 1 rectangularArray[0,2] = 2 rectangularArray[1,0] = 3 rectangularArray[1,1] = 4 rectangularArray[1,2] = 5 rectangularArray[2,0] = 6 rectangularArray[2,1] = 7
r e c t a n g u l a
rArray[2,2] = 8 rectangularArray[3,0] = 9
rectangularArray[3,1] = 10 rectangularArray[3,2] = 11
----------------------------------------------------------------------------V d trn cng tng t nh v d 9.4, nhng trong v d ny chng ta thc hin vic khi to trc tip khi to cc th hin:
int[,]rectangularArray= { {0,1,2},{3,4,5},{6,7,8},{9,10,11} };
Gi tr c gn thng qua bn danh sch trong ngoc mc, mi trong s l c ba thnh phn, bao hm mt mng 4x3. Nu chng ta vit nh sau:
int[,]rectangularArray= { {0,1,2,3},{4,5,6,7},{8,9,10,11} };
th s to ra mt mng 3x4.
V d, chng ta c th khai bo mng s nguyn hai chiu khc kch thc tn myJagged
Arraynh
sau:
int[][]myJaggedArray;
V d 9.6 to ra mng khc kch thc tn myJaggedArray, khi to cc thnh phn, ri sau in ra mn hnh. tit kim thi gian, chng ta s dng mng cc s nguyn cc thnh
V d 9.6: Mng khc chiu. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTester { staticvoidMain() { constintrows=4; //khaibomngtiabndngint[][] jaggedArray=newint[rows][]; //dngutinc5phnt jaggedArray[0]=newint[5]; //dngthhaic2phnt jaggedArray[1]=newint[2]; //dngthbac3phnt jaggedArray[2]=newint[3]; //dngcuicngc5phnt jaggedArray[3]=newint[5]; //khitomtvigitrchoccthnhphncamng jaggedArray[0][3]=15; jaggedArray[1][1]=12; jaggedArray[2][1]=9; jaggedArray[2][2]=99; jaggedArray[3][0]=10; jaggedArray[3][1]=11; jaggedArray[3][2]=12; jaggedArray[3][3]=13; jaggedArray[3][4]=14; for(inti=0;i<5;i++) { Console.WriteLine(jaggedArray[0][{0}]={1},i,
----------------------------------------------------------------------------Kt qu:
jaggedArray[0][0] = 0 jaggedArray[0][1] = 0 jaggedArray[0][2] = 0 jaggedArray[0][3] = 15 jaggedArray[0][4] = 0 jaggedArray[1][0] = 0 jaggedArray[1][1] = 12 jaggedArray[2][0] = 0 jaggedArray[2][1] = 9 jaggedArray[2][2] = 99 jaggedArray[3][0] = 10 jaggedArray[3][1] = 11 jaggedArray[3][2] = 12 jaggedArray[3][3] = 13 jaggedArray[3][4] = 14
Ch rng chiu th hai khng xc nh. Do sau chng ta c th khai bo mi dng c kch thc khc nhau. Bn lnh sau to cho mi dng mt mng mt chiu c
Sau khi to cc dng cho mng xong, ta thc hin vic a cc gi tr vo cc thnh phn ca mng. V cui cng l xut ni dung ca mng ra mn hnh. Ghi ch: Khi chng ta truy cp cc thnh phn ca mng kch thc bng nhau, chng ta t tt c cc ch mc ca cc chiu vo trong cng du ngc vung:
rectangularArray[i,j]
Tuy nhin vi mng c kch thc khc nhau ta phi tng ch mc ca tng chiu trong u ngoc vung ring:
jaggedArray[i][j]
Chuyn i mng
Nhng mng c th chuyn i vi nhau nu nhng chiu ca chng bng nhau v nu cc kiu ca cc thnh phn c th chuyn i c. Chuyn i tng minh gia cc mng xy ra nu cc thnh phn ca nhng mng c th chuyn i tng minh. V ngc li, chuyn i ngm nh ca mng xy ra nu cc thnh phn ca nhng mng c th chuyn i ngm nh. Nu mt mng cha nhng tham chiu n nhng i tng tham chiu, mt chuyn i c th c ti mt mng ca nhng i tng c s. V d 9.7 minh ha vic chuyn i mt mng kiu Buttonn mt mng nhng i tng. V d 9.7: Chuyn i gia nhng mng. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //tolplutrtrongmngpublic classEmployee {
publicEmployee(intempID) { this.empID=empID; }
publicoverridestringToString() { returnempID.ToString(); } // bin thnh vin private int empID; privateintsize; } publicclassTester { //phngthcnylymtmngccobject //chngtatruynvomngccitngEmployee //vsaulmngccstring,cschuyningm //vchaiiudnxuttlpobject publicstaticvoidPrintArray(object[]theArray) { Console.WriteLine(ContentsoftheArray:{0},theArray.ToString()); //inratngthnhphntrongmng foreach(objectobjintheArray) { //trnhbindchsgiobj.ToString() Console.WriteLine(Value:{0},obj); } } staticvoidMain() { //tomngccitngEmployee Employee[]myEmployeeArray=newEmployee[3]; //khitoccitngcamngfor (inti=0;i<3;i++) { myEmployeeArray[i]=newEmployee(i+5); } //hiuthgitrcamng PrintAr ray(m
PrintArray(array); } } }
----------------------------------------------------------------------------Kt qu:
Contents of the Array Programming_CSharp.Employee[] Value: 5 Value: 6 Value: 7 Contents of the Array Programming_CSharp.String[] Value: hello Value: world
khai bo ngm nh cho c hai lp stringv Employee. Phng thc PrintArray thc hin hai hnh ng. u tin, l gi phng thc ToString() ca mng:
Console.WriteLine(ContentsoftheArray{0},theArray.ToString());
Sau phng thc PrintArray thc hin tip vic gi phng thc ToString() trong mi thnh phn trong mng nhn c. Do ToString() l phng thc o ca lp c s
object,
v chng ta thc hin ph quyt trong lp Employee. Nn phng thc lp Employee c gi. Vic gi ToString() c th khng cn thit,
ToString() ca
System.Array
Lp mng Array cha mt s cc phng thc hu ch cho php m rng nhng kh nng ca mng v lm cho mng mnh hn nhng mng trong ngn ng khc (xem bng
9.1). Hai phng thc tnh hu dng ca lp Array l Sort() v Reverse(). C mt cch h tr y cho nhng kiu d liu nguyn thy nh l kiu. a mng lm vic vi nhng kiu khc
nh Button c mt s kh khn hn. V d 9.8 minh ha vic s dng hai phng thc thao tc i tng chui. V d 9.8: S dng Array.Sort() v Array.Reverse(). ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTester { publicstaticvoidPrintArray(object[]theArray) { foreach(objectobjintheArray) { Console.WriteLine(Value:{0},obj); } Console.WriteLine(\n); } staticvoidMain() { string[]myArray= { Who,is,Kitty,Mun }; PrintArray(myArray); Array.Reverse(myArray); PrintArray(myArray);string[] myOtherArray= { Chung,toi,la,nhung,nguoi, lap,trinh,may,tinh }; PrintArray( Array.Sort( myOtherArray myOtherArray ); );
PrintArray(myOtherArray); }
} }
-----------------------------------------------------------------------------
Kt qu:
Value: Who Value: is Value: Kitty Value: Mun Value: Mun Value: Kitty Value: is Value: Who Value: Chung Value: toi Value: la Value: nhung Value: nguoi Value: lap Value: trinh Value: may Value: tinh Value: Chung Value: la Value: lap Value: may Value: nguoi Value: nhung Value: tinh Value: toi Value: trinh
mng ny c in ra, sau c truyn vo cho hm Array.Reverse(), kt qu chng ta thy l kt qu ca chui nh sau:
Value: Value: Value:is Mun Kitty
Value:Who
Sau khi gi phng thc Array.Sort()th cc thnh phn ca mng c sp xp li theo th t alphabe:
Value:Chung Value:laValue: lapValue:may Value:nguoi Value:nhung Value:tinh Value:toi Value:trinh
B ch mc
i khi chng ta chng ta mong mun truy cp mt tp hp bn trong mt lp nh th bn thn lp l mt mng. V d, gi s chng ta to mt iu khin kiu
ListBox
chiu, mt bin thnh vin privatemyStrings. Mt List Box cha cc thuc tnh thnh vin v nhng phng thc v thm vo mng cha cc chui ca n. Tuy nhin, c th thun tin hn nu c th truy cp mng ListBox vi ch mc nh th ListBox l mt mng tht s. V d, ta c th truy cp i tng ListBox c to ra nh sau:
stringtheFirstString=myListBox[0]; stringtheLastString=myListBox[myListBox.Length1];
B ch mc l mt c ch cho php cc thnh phn client truy cp mt tp hp cha bn trong mt lp bng cch s dng c php ging nh truy cp mng ([]). Ch mc l mt loi thuc tnh c bit v bao gm cc phng thc get() v set() xc nhn nhng hnh vi ca chng. Chng ta c th khai bo thuc tnh ch mc bn trong ca lp bng cch s dng c php nh sau:
<kiudliu>this[<kiudliu><imc>] {get;set;}
khi kiu ca i mc c xc nh bi kiu ca i mc dng lm ch s vo trong tp hp cha i tng ch. Mc d kiu ca ch mc thng dng l cc kiu nguyn, chng ta
cng c th dng ch mc cho tp hp bng cc kiu d liu khc, nh kiu chui. Chng ta cng c th cung cp b ch mc vi nhiu tham s to ra mng a chiu. T kha this tham chiu n i tng ni m ch mc xut hin. Nh mt thuc tnh bnh thng, chng ta cng c th nh ngha phng thc get() v set() xc nh i tng no trong mng c yu cu truy cp hay thit lp. V d 9.9 khai bo mt iu khin ListBox, tn l ListBoxTest, i tng ny cha mt mng n gin (myStrings) v mt ch mc truy cp ni dung ca mng. Ghi ch: i vi lp trnh C++, b ch mc a ra ging nh vic np chng ton t ch mc ([]) trong ngn ng C++. Ton t ch mc khng c np chng trong ngn ng C#, v c thay th bi b ch mc. V d 9.9: S dng b ch mc. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //tolpListBox publicclassListBoxTest { //khitoListBoxvimtchui publicListBoxTest(paramsstring[]initialStrings) { //cpphtkhnggianchochui strings=newString[256]; //copychuitruyntthamsforeach (stringsininitialStrings) { strings[ctr++]=s; } } //thmmtchui publicvoidAdd(stringtheString) { if(ctr>=strings.Length) {
} //thchinbtruycppublic stringthis[intindex] { get { if(index<0||index>=strings.Length) { //xlchmcsai } } set { if(index>=ctr) { //xllichmckhngtnti } else } } //lyslngchuiclugipublic intGetNumEntries() { returnctr; } //ccbinthnhvnlugimngchobchmcprivate string[]strings; privateintctr=0; } //lpthcthipublic classTester { staticvoidMain() { strings[index]=value; returnstrings[index];
//tomtitngListBoxmivkhito ListBoxTestlbt=newListBoxTest(Hello,World);
//thmmtschuivolbt lbt.Add(Who); lbt.Add(is); lbt.Add(Ngoc); lbt.Add(Mun); //dngbchmc stringstrTest=Universe; lbt[1]=strTest; //truycpvxutttcccchui for(inti=0;i<lbt.GetNumEntries();i++) { Console.WriteLine(lbt[{0}]:{1},i,lbt[i]); } } } }
----------------------------------------------------------------------------Kt qu:
lbt[0]: Hello lbt[1]: Universe lbt[2]: Who lbt[3]: is lbt[4]: Ngoc lbt[5]: Mun
----------------------------------------------------------------------------Trong chng trnh trn, i tng ListBox lu gi mt mng cc chui myStrings v mt bin thnh vin ctrm s chui c cha trong mng myStrings. Chng ta khi to mt mng ti a 256 chui nh sau:
myStrings=newString[256];
Phn cn li ca b khi dng l thm cc chui c truyn vo tham s, v n gin dng lnh lp foreach ly tng thnh phn trong mng tham s a vo myStrings Ghi ch: Nu chng ta khng bit s lng bao nhiu tham s c truyn vo phng thc, chng ta s dng t kha paramsnh m t trong phn trc ca chng. Phng thc Add() ca ListBoxTestkhng lm g khc hn l thm mt chui mi vo bn trong mng myStrings. Tuy nhin phng thc quan trng ca ListBoxTestl b ch mc. Mt b ch mc th khng
C php ca b ch mc cng tng t nh nhng thuc tnh. Chng c th c phng thc get()hay set()hay c hai phng thc. Phng thc get()c thc thi u tin bng cch kim tra gi tr bin ca ch mc v gi s ch mc i hi hp l, th phng thc tr v gi tr i hi:
get { if(index<0||index>=myStrings.Length) { //xlchmcsai } returnmyStrings[index]; }
i vi phng thc set()th u tin n s kim tr xem ch mc ca i tng cn ly c vt qu s lng ca cc i tng trong mng hay khng. Nu gi tr ch mc hp l tc l tn ti mt i tng c ch mc tng ng, phng thc s bt u thit lp li gi tr ca i tng ny. T kha valuec s dng tham chiu n tham s a vo trong php gn ca thuc tnh:
set { if(index>=ctr) { //chmckhngtnti } }
trnh bin dch s gi phng thc set() ca b ch mc trn i tng v truyn vo mt chui Hello C# nh l mt tham s ngm nh tn l value.
B ch mc v php gn
Trong v d 9.9, chng ta khng th gn n mt ch mc nu n khng c gi tr. Do , nu chng ta vit:
lbt[10]=ah!;
Chng ta c th vit iu kin rng buc bn trong phng thc set(), lu rng ch mc
m chng ta truyn vo l 10 ln hn b m s i tng hin thi l 6. D nhin, chng ta c th s dng phng thc set() cho php gn, n gin l phi x l nhng ch mc m ta nhn c. lm c iu ny, chng ta phi thay i phng thc
set()
iu ny c th cho php chng ta to mt mng phn mng cc gi tr, khi ta c th gn cho i tng c ch mc th 10 m khng cn phi c php gn vi i tng trc c ch mc l 9. iu ny hon ton thc hin tt v ban u chng ta cp pht mng 256 cc phn t. Do ch cn truy cp n i tng c ch mc t 0 n 255 l hp l. Khi ta c th vit:
lbt[10]=ah!;
mc
ny c th s dng kiu chui lm ch mc hay nhng kiu d liu khc ngoi kiu s nguyn thng dng. Trong trng hp lp ListBox trn, chng ta mun dng gi tr chui lm ch mc cho mng string. V d 9.10 sau s dng chui lm ch mc cho lp ListBox. B ch mc gi phng thc findString() ly mt gi tr tr v l mt s nguyn da trn chui c cung cp. Lu rng y b ch mc c np chng v b ch mc t v d 9.9 trc vn cn tn ti. V d 9.10: Np chng ch mc. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //tolpListBox publicclassListBoxTest { //khitovinhngchui publicListBoxTest(paramsstring[]initialStrings) { //cpphtchui strings=newString[256]; //copyccchuitruynvoforeach( stringsininitialStrings) { strings[ctr++]=s; } } //thmmtchuivocuidanhschpublic voidAdd(stringtheString) { strings[ctr]=theString; ctr++; } //bchmc publicstringthis[intindex] {
get { if(index<0||index>=strings.Length)
{ //chmckhnghpl } returnstrings[index]; } set { strings[index]=value; } } privateintfindString(stringsearchString) { for(inti=0;i<strings.Length;i++) { if(strings[i].StartsWith(searchString)) { returni; } } return1; } //bchmcdngchui publicstringthis[stringindex] { get { if(index.Length==0) { //xlkhichuirng } } set { } }
strings[findString(index)]=value;
//lyschuitrongmng
publicintGetNumEntries() { returnctr; } //binthnhvinlugimngccchuiprivate string[]strings; //binthnhvinlugiaschuitrongmngprivate intctr=0; } publicclassTester { staticvoidMain() { //toitngListBoxvsaukhito ListBoxTestlbt=newListBoxTest(Hello,World); //thmccchuivo lbt.Add(Who); lbt.Add(is); lbt.Add(Ngoc); lbt.Add(Mun); // truy cp b ch mc string str = Universe; lbt[1]=str; lbt[Hell]=Hi; //lbt[xyzt]=error!; //lyttcccchuira for(inti=0;i<lbt.GetNumEntries();i++) { Console.WriteLine(lbt[{0}]={1},i,lbt[i]); } } } }
-----------------------------------------------------------------------------
t qu: lbt[0]:
Hi lbt[1]: Universe lbt[2]: Who
----------------------------------------------------------------------------V d 9.10 th tng t nh v d 9.9 ngoi tr vic thm vo mt ch mc c np chng ly tham s ch mc l chui v phng thc findString() to ra ly ch mc nguyn t chui. Phng thc findString()n gin l lp mng stringscho n khi no tm c chui c k t u tin trng vi k t u tin ca chi tham s. Nu tm thy th tr v ch mc ca chui, trng hp ngc li tr v -1. Nh chng ta thy trong hm Main(), lnh truy cp ch mc th hai dng chui lm tham s ch mc, nh lm vi s nguyn trc:
lbt[hell]=Hi;
Khi np chng ch mc s c gi, sau khi kim tra chui hp l tc l khng rng, chui ny s c truyn vo cho phng thc findString(), kt qu findString() tr v l mt ch mc nguyn, s nguyn ny s c s dng lm ch mc:
returnthis[findString(index)];
V d 9.10 trn tn ti li khi mt chui truyn vo khng ph hp vi bt c chui no trong mng, khi gi tr tr v l 1. Sau gi tr ny c dng lm ch mc vo chui mng strings. iu ny s to ra mt ngoi l (System.NullReferenceException). Trng hp ny xy ra khi chng ta b u comment ca lnh:
lbt[xyzt]=error!;
Cc trng hp pht sinh li ny cn phi c loi b, y c th l bi tp cho chng ta lm thm v vic ny ht sc cn thit.
Giao din tp hp
Mi trng .NET cung cp nhng giao din chun cho vic lit k, so snh, v to cc tp hp. Mt s cc giao din trong s c lit k trong bng 9.2 sau: Giao din
IEnumerable ICollection
bi tt c cc tp hp cung cp
IList
So snh gia hai i tng lu gi trong tp hp spdxp cciing tptrong mng c ch mc S ng b nh tng hp tp hp.
IDictionary IDictionaryEnumerator
Cho php lit k dng cu lnh foreach qua tp hp h tr IDictionary. Bng 9.2: Giao din cho tp hp.
thc thi trc tip trong lp cha (trong trng hp ny l lp ListBoxTest) hay bi mt lp phn bit khc. Cch tip cn th hai thng c s dng nhiu hn, do chng c ng gi trong lp Enumeratorhn l vic phn vo trong cc lp cha. Do lp Enumeratorc xc nh cho lp cha, v theo nh trn th lp ListBoxEnumeratorphi bit nhiu v lp ListBoxTest. Nn chng ta phi to cho n mt s thc thi ring cha bn trong lp ListBoxTest. Lu rng phng thc GetEnumerator truyn i tng ListBoxTest hin thi (this) cho enumerator. iu ny cho php enumeratorc th lit k c cc thnh phn trong tp hp ca i tng ListBoxTest. y lp thc thi Enumerator l
ListBoxEnumerator, MoveNext(),
thc thi n gin bao gm mt thuc tnh public, v hai phng thc publicl v Reset(). i tng ListBoxTest c truyn vo nh mt i mc ca b khi to. y n c gn cho bin thnh vin myLBT. Trong hm khi to ny cng thc hin thit lp gi tr bin thnh vin index l -1, ch ra rng cha bt u thc hin vic
enumeratori { this.lbt=lbt; index=1;
tng:
publicListBoxEnumerator(ListBoxTestlbt)
Phng thc MoveNext()gia tng indexv sau kim tra m bo rng vic thc hin khng vt qu s phn t trong tp hp ca i tng:
publicboolMoveNext()
Phng thc IEnumerator.Reset()khng lm g c nhng thit lp li gi tr ca index l -1. Thuc tnh Currenttr v i tng chui hin hnh. l tt c nhng vic cn lm cho lp ListBoxTest thc thi mt giao din IEnumerator. Cu lnh foreach s c gi em v mt enumerator, v s dng n lit k ln lt qua cc thnh phn trong mng. Sau y l ton b chng trnh minh ha cho vic thc thi trn. V d 9.11: To lp ListBoxh tr enumerator. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; //tomtcontrolngin publicclassListBoxTest:IEnumerable { //lpthcthiringListBoxEnumerator privateclassListBoxEnumerator:IEnumerator { publicListBoxEnumerator(ListBoxTestlbt) { this.lbt=lbt; index=1; } //giatngindexvmbogitrnyhplpublic boolMoveNext() { index++; if(index>=lbt.strings.Length) returnfalse; } else returntrue;
publicvoidReset() { index=1; } publicobjectCurrent { get { return(lbt[index]); } } privateListBoxTestlbt; privateintindex; } //trvEnumerator publicIEnumeratorGetEnumerator() { return(IEnumerator)newListBoxEnumerator(this); } //khitolistboxvichui publicListBoxTest(paramsstring[]initStr) { strings=newString[10]; //copytmngchuithams foreach(stringsininitStr) { strings[ctr++]=s; } } publicvoidAdd(stringtheString) { strings[ctr]=theString; ctr++; } //chophptruycpgingnhmngpublic
stringthis[intindex] { get
{ if(index<0||index>=strings.Length) { //xlindexsai } returnstrings[index]; } set { strings[index]=value; } } //schuinmgi publicintGetNumEntries() { returnctr; } privatestring[]strings; privateintctr=0; } publicclassTester { staticvoidMain() { ListBoxTestlbt=newListBoxTest(Hello,World); lbt.Add(What); lbt.Add(Is); lbt.Add(The); lbt.Add(C); lbt.Add(Sharp); stringsubst=Universe; lbt[1]=subst; //truycpttcccchuiint count=1;
} } } }
----------------------------------------------------------------------------Kt qu:
Value 1: Hello Value 2: Universe Value 3: What Value 4: Is Value 5: The Value 6: C Value 7: Sharp Value 8: Value 9: Value 10:
----------------------------------------------------------------------------Chng trnh thc hin bng cch to ra mt i tng ListBoxTestmi v truyn hai chui vo cho b khi dng. Khi mt i tng c to ra th mng ca chui c nh ngha c kch thc 10 chui. Nm chui sau c a vo bng phng thc Add(). V chui th hai sau c cp nht li gi tr mi. S thay i ln nht ca chng trnh trong phin bn ny l cu lnh foreachc gi truy cp tng chui trong ListBox. Vng lp foreach t ng s dng giao din IEnumeratorbng cch gi phng thc GetEnumerator(). Mt i tng ListBoxEnumeratorc to ra v gi tr index = -1 c thit lp trong b khi to. Vng lp foreachsau gi phng thc MoveNext(), khi indexs c gia tng n 0 v tr v true. Khi foreach s dng thuc tnh Current nhn li chui hin hnh. Thuc tnh Currentgi ch mc ca ListBox v nhn li chui c lu tr ti v tr 0. Chui ny c gn cho bin s c nh ngha trong vng lp, v chui ny c hin th ra mn hnh console. Vng lp tip tc thc hin tun t tngt bc: MoveNext(), Current(), hin th chui cho n khi tt c cc chui trong listbox c hin th. Trong minh ha ny chng ta khai bo mng chui c 10 phn t, nn trong kt qu ta thy chui v tr 8, 9, 10 khng c ni dung.
phng
thc CopyTo(). Thuc tnh thng c s dng l Count, thuc tnh ny tr v s thnh phn trong tp hp:
for(inti=0;i<myIntArray.Count;i++) { //... }
y chng ta s dng thuc tnh Count ca myIntArray xc nh s i tng c th c s dng trong mng.
i tng thc thi IComparable. Nu chng ta mun to ra nhng lp c th c sp xp bn trong mt tp hp th chng ta cn thit phi thc thi IComparable. .NET Framework cung cp mt lp Comparerthc thi IComparablev cung cp mt s thc thi cn thit. Phn danh sch mng sau s i vo chi tit vic thc thi IComparable.
FixedSize()
Phng thc static np chng tr v sanh sch i tng nh l mt wrapper. Danh sch c kch thc c nh, cc thnh phn ca n c th c sa cha nhng khng th
ReadOnly() Repeat() Synchronized() Capacity Count IsFixedSize IsReadOnly IsSynchronized Item() SyncRoot Add() AddRange() BinarySearch()
Phng thc static np chng tr v danh sch lp nh l mt wrapper, ch cho php c. Phng thc static tr v mt ArrayList m nhng thnh phn ca n c sao chp vi gi tr xc nh. Phng thc static tr v danh sch wrapper c threadsafe Thuc tnh get hay set s thnh phn trong ArrayList. Thuc tnh nhn s thnh phn hin thi trong mng Thuc tnh kim tra xem kch thc ca ArrayList c c nh hay khng m tra xem ArrayList c thuc tnh ch Thuc tnh ki c hay khng. kim tra xem ArrayListc thread-safe hay Thuc tnh khng Thit lp hay truy cp thnh phn trong mng ti v tr xc nh. y ltr v i ctngcArrayList. c s dng Thuc tnh b ch m cho l p th ng bngcp c n ArrayList Ph truy th public thm mt i tng vo ArrayList Phng thc public thm nhiu thnh phn ca mt
ICollectionvo ni chng public s Phng thc cu p ca ArrayList
sp xp. Xa tt c cc thnh phn t ArrayList To mt bn copy Kim tra mt thnh phn xem c cha trong mng hay khng thc public np chng sao chp mt ArrayList Phng n mt mng mt chiu. Phng thc publicnp chng tr v mt enumeratordng lp qua mng Sao chp mt dy cc thnh phn n mt ArrayListmi Phng thc publicnp chng tr v ch mc v tr u tin xut hin thnh phn vo trong ArrayList Chn mt gi tr Chn mt dy tp hp vo trong ArrayList
Phng thc publicnp chng tr v ch mc tr tr cui cng xut hin gi tr. Xa s xut hin u tin ca mt i tng xc nh. Xa mt thnh phn v tr xc nh. Xa mt dy cc thnh phn. o th t cc thnh phn trong mng. Sao chp nhng thnh phn ca tp hp qua dy nhng thnh p ArrayList.ArrayList. Sp x phn trong Sao chp nhng thnh phn ca ArrayList n mt mng mi. Thit lp kch thc tht s cha cc thnh phn trong
ArrayList Bng 9.3: Cc phng thc v thuc tnh ca ArrayList
Khi to i tng ArrayList, khng cn thit phi nh ngha s i tng m n s cha. Chng ta thm vo ArrayList bng cch dng phng thc Add(), v danh sch s quan l nhng i tng bn trong m n lu gi. V d 9.12 sau minh ha s dng
ArrayList.
V d 9.12: S dng ArrayList. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; //mtlpnginlutrtrongmngpublic classEmployee { publicEmployee(intempID) { this.empID=empID; } publicoverridestringToString() { returnempID.ToString(); } publicintEmpID {
get {
returnempID; } set { } } privateintempID; } publicclassTester { staticvoidMain() { ArrayListempArray=newArrayList(); ArrayListintArray=newArrayList(); //avomng for(inti=0;i<5;i++) { empArray.Add(newEmployee(i+100)); intArray.Add(i*5); } //inttcnidung for(inti=0;i<intArray.Count;i++) { Console.Write({0},intArray[i].ToString()); } Console.WriteLine(\n); //inttcnidungcamng for(inti=0;i<empArray.Count;i++) { Console.Write({0},empArray[i].ToString()); } Console.WriteLine(\n); Console.WriteLine(empArray.Count:{0},empArray.Count); Console.WriteLine(empArray.Capacity:{0},empArray.Capacity); } } } empID=value;
----------------------------------------------------------------------------Kt qu:
0 5 10 101 15 102 20 103 104 100
empArray.Count: 5 empArray.Capacity: 16
----------------------------------------------------------------------------Vi lp Array phi nh ngha s i tng m mng s lu gi. Nu c thm cc thnh phn vo trong mng vt qu kch thc mng th lp mng s pht sinh ra ngoi l. Vi ArrayList th khng cn phi khai bo s i tng m n lu gi.
ArrayList c
publicintCapacity{virtualget;virtualset;}
Mc nh gi tr ca Capacityl 16, nu khi thm thnh phn th 17 vo th Capacityt ng nhn i ln l 32. Nu chng ta thay i vng lp nh sau:
for(inti=0;i<17;i++)
th kt qu ging nh sau:
05101520253035404550556065707580 56789101112131415161718192021 empArray.Capacity:32
thc thi giao din IComparable, i tng Employee phi cung cp mt phng thc
CompareTo(): publicintCompareTo(Objecto) { Employeer=(Employee)o; returnthis.empID.CompareTo(r.empID); }
snh chnh n vi i tng ny v tr v -1 nu n nh hn i tng ny, 1 nu n ln hn, v cui cng l gi tr 0 nu c hai i tng bng nhau. Vic xc nh th t ca Employee
thng qua th t ca empID l mt s nguyn. Do vy vic so snh s c y quyn cho thnh vin empID, y l s nguyn v n s s dng phng thc so snh mc nh ca kiu d liu nguyn. iu ny tng ng vi vic so snh hai s nguyn. Lc ny chng ta co th thc hin vic so snh hai i tng Employee. thy c cch sp xp, chng ta cn thit phi thm vo cc s nguyn vo trong mng Employee, cc s nguyn ny c ly mt cch ngu nhin. to mt gi tr ngu nhin, chng ta cn thit lp mt i tng ca lp Random, lp ny s tr v mt s gi s ngu nhin. Phng thc Next() c np chng, trong mt phin bn cho php chng ta truyn vo mt s nguyn th hin mt s ngu nhin ln nht mong mun. Trong trng hp ny chng ta a vo s 10 to ra nhng s ngu nhin t 0 n 10:
Randomr=newRandom(); r.Next(10);
V d minh ha 9.13 to ra mt mng cc s nguyn v mt mng Employee, sau a vo nhng s ngu nhin, ri in kt qu. Sau sp xp c hai mng v in kt qu cui cng. V d 9.13: Sp xp mng s nguyn v mng Employee. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; //mtlpnginlutrtrongmngpublic classEmployee:IComparable { publicEmployee(intempID) { this.empID=empID; } publicoverridestringToString() { returnempID.ToString(); } publicintEmpID { get {
} set
returnempID;
{ empID=value; } } //SosnhcdelegatechoEmployee //Employeesdngphngthcsosnh //mcnhcasnguynpublicint CompareTo(Objecto) { Employeer=(Employee)o; returnthis.empID.CompareTo(r.empID); } privateintempID; } publicclassTester { staticvoidMain() { ArrayListempArray=newArrayList(); ArrayListintArray=newArrayList();Random r=newRandom(); //avomng for(inti=0;i<5;i++) { empArray.Add(newEmployee(r.Next(10)+100)); intArray.Add(r.Next(10)); } //inttcnidung for(inti=0;i<intArray.Count;i++) { Console.Write({0},intArray[i].ToString()); } Console.WriteLine(\n); //inttcnidungcamng for(inti=0;i<empArray.Count;i++)
{ }
Console.Write({0},empArray[i].ToString());
Console.WriteLine(\n); //spxpvhinthmngnguyn intArray.Sort(); for(inti=0;i<intArray.Count;i++) { Console.Write({0},intArray[i].ToString()); } Console.WriteLine(\n); //spxplimngEmployee empArray.Sort(); //hinthttcnidungcamngEmployeefor(inti =0;i<empArray.Count;i++) { Console.Write({0},empArray[i].ToString()); } Console.WriteLine(\n); } } }
----------------------------------------------------------------------------Kt qu:
8 3 5 3 7 103 5 103 7 3 3 107 8 104 105 107 104 102 105 102
----------------------------------------------------------------------------Kt qu ch ra rng mng s nguyn v mng Employeec to ra vi nhng s ngu nhin, v sau chng c sp xp v c hin th li gi tr mi theo th t sau khi sp xp.
Chng ta c th t do to mt thc thi ca IComparer ring, iu ny cho php ta c th ty chn cch thc hin vic sp xp cc thnh phn trong mng. Trong v d minh ha
th
EmployeeComparerbit
v nhng i tng Employeev cng bit cch sp xp chng. EmployeeComparerc mt thuc tnh, WhichComparisionc kiu l Employee.EmployeeComparer.ComparisionType:
publicEmployee.EmployeeComparer.ComparisionTypeWhichComparision { get { returnwhichComparision; } set { } } ComparisionTypel wichComparision=value;
Trc khi gi Sort(), chng ta s to th hin ca EmployeeComparerv thit lp gi tr cho thuc tnh kiu ComparisionType:
Employee.EmployeeComparerc=Employee.GetComparer(); c.WhichComparision=Employee.EmployeeComparer.ComparisionType.EmpID; empArray.Sort(c);
returnl.CompareTo(r.WhichComparision); }
i tng Employeephi thc thi mt phin bn ring ca CompareTo() thc hin vic so snh:
Sau y l v d 9.14 th hin y vic thc thi IComparer cho php thc hin sp xp theo hai tiu chun khc nhau. Trong v d ny mng s nguyn c xa i lm cho n gin ha v d. V d 9.14: Sp xp mng theo tiu chun ID v nm cng tc. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; //lpnginlutrtrongmngpublic classEmployee:IComparable { publicEmployee(intempID) { this.empID=empID; } publicEmployee(intempID,intyearsOfSvc) { this.empID=empID; this.yearsOfSvc=yearsOfSvc; } publicoverridestringToString() { returnID:+empID.ToString()+.YearsofSvc: +
yearsOfSvc.ToString(); }
//phngthctnhnhnitngComparerpublic staticEmployeeComparerGetComparer() { returnnewEmployee.EmployeeComparer(); } publicintCompareTo(Objectrhs) { Employeer=(Employee)rhs; returnthis.empID.CompareTo(r.empID); } //thcthicbitcgibicustomcomparerpublic intCompareTo(Employeerhs, Employee.EmployeeComparer.ComparisionTypewhich) { switch(which) { caseEmployee.EmployeeComparer.ComparisionType.EmpID: returnthis.empID.CompareTo(rhs.empID); caseEmployee.EmployeeComparer.ComparisionType.Yrs: returnthis.yearsOfSvc.CompareTo(rhs.yearsOfSvc); } return0; } //lpbntrongthcthiIComparer publicclassEmployeeComparer:IComparer { //nhnghakiulitk publicenumComparisionType { EmpID, Yrs }; //yucunhngitngEmployeetsosnhvinhaupublicint Compare(objectlhs,objectrhs) {
} publicEmployee.EmployeeComparer.ComparisionTypeWhichComparision { get { returnwhichComparision; } set { } } privateEmployee.EmployeeComparer.ComparisionTypewhichComparision; } privateintempID; privateintyearsOfSvc=1; } publicclassTeser { staticvoidMain() { ArrayListempArray=newArrayList(); Randomr=newRandom(); //avomng for(inti=0;i<5;i++) { empArray.Add(newEmployee(r.Next(10)+100,r.Next(20))); } //hinthttcnidungcamngEmployeefor(int i=0;i<empArray.Count;i++) { Console.Write(\n{0},empArray[i].ToString()); } Console.WriteLine(\n); whichComparision=value;
empArray.Sort(c); //hinthnidungcamng for(inti=0;i<empArray.Count;i++) { Console.Write(\n{0},empArray[i].ToString()); } Console.WriteLine(\n); c.WhichComparision=Employee.EmployeeComparer.ComparisionType.Yrs; empArray.Sort(c); //hinthnidungcamng for(inti=0;i<empArray.Count;i++) { Console.Write(\n{0},empArray[i].ToString()); } Console.WriteLine(\n); } } }
----------------------------------------------------------------------------Kt qu:
ID: 100. Years of Svc: 16 ID: 102. Years of Svc: 8 ID: 107. Years of Svc: 17 ID: 105. Years of Svc: 0 ID: 101. Years of Svc: 3 ID: 100. Years of Svc: 16 ID: 101. Years of Svc: 3 ID: 102. Years of Svc: 8 ID: 105. Years of Svc: 0 ID: 107. Years of Svc: 17 ID: 105. Years of Svc: 0 ID: 101. Years of Svc: 3 ID: 102. Years of Svc: 8 ID: 100. Years of Svc: 16 ID: 107. Years of Svc: 17
-------------------------------------
-----------------------------------
pht sinh ngu nhin. Khi th hai hin th kt qu sau khi sp theo empID,
Hng i (Queue)
Hng i l mt tp hp trong c th t vo trc v ra trc (FIFO). Tng t nh l nhng ngi mua v tu, h xp thnh mt hng, ngi no vo trc th s mua trc v ra trc. Hng i l kiu d liu tt qun l nhng ngun ti nguyn gii hn. V d, chng ta mun gi thng ip n mt ti nguyn m ch x l c duy nht mt thng ip mt ln. Khi chng ta s thit lp mt hng i thng ip x l cc thng ip theo th t a vo. Lp Queue th hin kiu d liu nh trn, trong bng 9.4 sau lit k nhng phng thc v thuc tnh thnh vin. Phng thc- thuc tnh
Synchronized() Count IsReadOnly IsSynchronized SyncRoot Clear() Clone() Contains() CopyTo() Dequeue() Enqueue() GetEnumerator() Peek() ToArray()
Mc ch Phng thc static tr v mt Queue wrapper c thread-safe. tr v s thnh phn trong hng i Thuc tnh Thuc tnh xc nh hng i l ch c Thuc tnh xc nh hng i c ng b Thuc tnh tr v i tng c th c s dng ngtt ctruy cp Queuen trong hng i Xa b cc thnh ph . To ra mt bn sao Xc nh xem mt thnh phn c trong mng. Sao chp nhng thnh phn ca hng i n mng mt v tr tthnh iphn bt u ca hng i. Xa chiu v n t Thm mt thnh phn vo hng i. Tr v mt enumeratorcho hng i. Tr v phn t u tin ca hng i v khng xa n. chp nhng thnh phn qua mt mng mi Sao
Bng 9.4: Nhng phng thc v thuc tnh ca Queue. Chng ta c th thm nhng thnh phn vo trong hng i vi phng thc Enqueuev sau ly chng ra khi hng i vi Dequeuehay bng s dng enumerator. V d 9.15 minh ha vic s dng hng i. V d 9.15: Lm vic vi hng i.
-----------------------------------------------------------------------------
namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; publicclassTester { publicstaticvoidMain() { QueueintQueue=newQueue(); //avotrongmng for(inti=0;i<5;i++) { intQueue.Enqueue(i*5); } //hinthhngi Console.Write(intQueuevalues:\t); PrintValues(intQueue); //xathnhphnrakhihngi Console.WriteLine(\nDequeue\t{0},intQueue.Dequeue()); //hinthhngi Console.Write(intQueuevalues:\t); PrintValues(intQueue); //xathnhphnkhihngi Console.WriteLine(\nDequeue\t{0},intQueue.Dequeue()); //hinthhngi Console.Write(intQueuevalues:\t); PrintValues(intQueue); //Xemthnhphnutintronghngi. Console.WriteLine(\nPeek //hinthhngi Console.Write(intQueuevalues:\t); PrintValues(intQueue); } publicstaticvoidPrintValues(IEnumerablemyCollection) \t{0},intQueue.Peek());
Console.WriteLine(); } } }
----------------------------------------------------------------------------Kt qu:
intQueue values: Dequeue 0 5 10 10 10 15 15 15 20 20 20 intQueue values: Dequeue 5 intQueue values: Peek 10 intQueue values: 0 5 10 15 20
----------------------------------------------------------------------------Trong v d ny ArrayList c thay bng Queue, chng ta cng c th Enqueuenhng i tng do ta nh ngha. Trong trong chng trnh trn u tin ta a 5 s nguyn vo trong hng i theo t t 0 5 10 15 20. Sau khi a vo ta ly ra phn t u tin l 0 nn hng i cn li 4 s l 5 10 15 20, ln th hai ta ly ra 5 v ch cn 3 phn t trong mng 10 15 20. Cui cng ta dng phng thc Peek() l ch xem phn t u hng i ch khng xa chng ra khi hng i nn kt qu cui cng hng i vn cn 3 s l 10 15 20. Mt im lu l lp Queue l mt lp c th m c enumerable nn ta c th truyn vo phng thc PrintValues vi kiu tham s khai bo IEnumerable. Vic chuyn i ny l ngm nh. Trong phng thc PrintValues ta gi phng thc GetEnumerator, nn nh rng y l phng thc n ca tt c nhng lp IEnumerable. Kt qu l mt i tng Enumeratorc tr v, do chng ta c th s dng chng lit k tt c nhng i tng c trong tp hp.
Ngn xp (stack)
Ngn xp l mt tp hp m th t l vo trc ra sau hay vo sao ra trc (LIFO), tng nh mt chng a c xp trong nh hng. a trn cng tc l a xp sau th c ly ra trc do vy a nm di y tc l a a vo u tin s c ly ra sau cng. Hai phng thc chnh cho vic thm v xa t stack l Push v Pop, ngoi ra ngn xp cng a ra phng thc Peek tng t nh Peek trong hng i. Bng 9.5 sau minh ha cc phng thc v thuc tnh ca lp Stack. Phng thc- thuc tnh Mc ch
Synchronized()
Count IsReadOnly IsSynchronized SyncRoot Clear() Clone() Contains() CopyTo() Pop() Push() GetEnumerator() Peek() ToArray()
Thuc tnh tr v s thnh phn trong ngn xp Thuc tnh xc nh ngn xp l ch c Thuc tnh xc nh ngn xp c ng b Thuc tnh tr v i tng c th c s dng ngccc thnh phn.trong ngn xp Xa tt b truy cp Stack To ra mt bn sao Xc nh xem mt thnh phn c trong mng. Sao chp nhng thnh phn ca ngn xp n mng mt chiu n tn u Stack Xa v tr v ph t ti a mt i tng vo u ngn xp Tr v mt enumeratorcho ngn xp. Tr v phn t u tin ca ngn xp v khng xa n. nhng thnh phn qua mt mng mi Sao chp Bng 9.5 : Phng thc v thuc tnh ca lp Stack.
Ba lp ArrayList, Queue, v Stacku cha phng thc np chng CopyTo()v ToArray() d sao chp nhng thnh phn ca chng qua mt mng. Trong trng hp ca ngn xp phng thc CopyTo() s chp nhng thnh phn ca chng n mng mt chiu hin hu, v vit chng ln ni dung ca mng bt u ti ch mc m ta xc nhn. Phng thc ToArray() tr v mt mng mi vi nhng ni dung ca nhng thnh phn trong mng. V d 9.16: S dng kiu Stack. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; //lpnginlutr publicclassTester { staticvoidMain() { StackintStack=newStack(); //avongnxp for(inti=0;i<8;i++)
{ intStack.Push(i*5);
} //hinthstackConsole.Write(intStack values:\t);PrintValues(intStack); //xaphntutin Console.WriteLine(\nPop\t{0},intStack.Pop()); //hinthstackConsole.Write(intStack values:\t);PrintValues(intStack); //xatipphntkhc Console.WriteLine(\nPop\t{0},intStack.Pop()); //hinthstackConsole.Write(intStack values:\t);PrintValues(intStack); //xemthnhphnutinstack Console.WriteLine(\nPeek \t{0},intStack.Peek());
//hinthstackConsole.Write(intStack values:\t);PrintValues(intStack); //khaibomngvi12phnt ArraytargetArray=Array.CreateInstance(typeof(int),12); for(inti=0;i<=8;i++) { targetArray.SetValue(100*i,i); } //hinthgitrcamng Console.WriteLine(\nTargetarray:); PrintValues(targetArray); //chptonbstackvomngtivtr6 intStack.CopyTo(targetArray,6); //hinthgitrcamngsaucopy Console.WriteLine(\nTargetarrayaftercopy:); PrintValues(targetArray); //chptonbstackvomngmi Object[]myArray=intStack.ToArray(); //hinthgitrcamngmi Console.WriteLine(\nThenewarray:); PrintValue s(myArray );
----------------------------------------------------------------------------Kt qu:
intStack values: Pop Pop Peek 35 30 25 25 400 400 5 0 500 500 25 20 20 600 25 20 15 15 700 20 15 10 10 10 5 5 0 0 0 5 0 0 0 5 0 30 25 intStack values: intStack values: intStack values: Target array: 0 0 25 100 100 20 200 200 15 300 300 10 800 15 10 Target array after copy: The new array: 35 30 25 20 15 10 5 0
----------------------------------------------------------------------------Kt qu cho thy rng cc mc c a vo trong ngn xp v c ly ra theo th t LIFO. Trong v d s dng lp Arraynh l lp c s cho tt c cc lp mng. To ra mt mng vi 12 phn t nguyn bng cch gi phng thc tnh CreateInstance(). Phng thc ny c hai tham s mt l kiu d liu trong trng hp ny l s nguyn int v tham s th hai th hin kch thc ca mng. Mng sau c a vo bng phng thc SetValue() phng thc ny cng ly hai tham s l i tng c thm vo v v tr c thm vo. Nh kt qu cho ta thy phng thc CopyTo() vit chng ln gi tr ca mng t v tr th 6. Lu rng phng thc ToArray() c thit k tr v mt mng i tng do vy mng myArrayc khai bo tng ng.
Object[]myArray=myIntStack.ToArray();
Kiu t in
T in l kiu tp hp trong c hai thnh phn chnh lin h vi nhau l kha v gi tr. Trong t in ngn ng nh Oxford th s lin h gia t (kha) v phn nh ngha t (gi tr). tm thy gi tr trong t in chng ta hy tng tng rng chng ta mun gi mt danh sch cc th ph ca bang. Mt hng tip cn l t chng vo trong mt mng theo th t anphabe nh sau:
string[]stateCapitals=newstring[50];
Mng stateCapitals nm gi 50 th ph bang. Mi th ph c truy cp nh mt khong di (offset) trong mng. V d, truy cp th ph ca bang Arkansas, chng ta cn phi bit bang Arkansas nm v tr th t trong th t alphabe danh sch cc bang, nn ta c th truy cp nh sau:
stringcapitalOfArkansas=stateCapitals[3];
Tuy nhin, tht khng thun tin khi khi truy cp cc th ph ca cc bang thng qua cu trc mng nh vy. Gi s nu chng ta mun truy cp th ph ca bang Massachusett, khng phi d dng xc nh rng th t ca bang l th 21 theo alphabe. Mt cch thun tin hn l lu tr th ph theo tn ca bang. Mt t in cho php chng ta lu tr mt gi tr (trong trng hp ny l th ph) v vi mt kha truy cp (l tn ca bang). Kiu d liu t in trong .NET Framework c th kt hp bt c kiu kha no nh kiu chui, s nguyn, i tng...vi bt c kiu gi tr no (chui, s nguyn, kiu i tng). Thuc tnh quan trng ca mt t in tt l d thm gi tr mi vo, v nhanh chng truy cp n gi tr. Mt vi t in th nhanh hn v thi gian thm mt gi tr mi vo, mt s khc th ti u cho vic truy cp. Mt trong minh ha cho kiu t in l kiu d liu hashtable hay cn gi l bng bm.
Hashtables
Hashtable l
cc phng thc chnh v cc thuc tnh ca kiu d liu Hashtable c trnh by trong bng 9.6 di. Phng thc- thuc tnh
Synchronized() Count IsReadOnly IsSynchronized
Mc ch Phng thc static tr v mt Hashtable wrapper c thread-safe. Thuc tnh tr v s thnh phn trong hashtable Thuc tnh xc nh hashtablel ch c Thuc tnh xc nh hashtablec ng b
SyncRoot
Keys Values Add() Clear() Item() Clone() Contains() ContainsKey() CopyTo() GetEnumerator() GetObjectData() OnDeserialization Remove()
Thuc tnh tr v mt ICollectioncha nhng kha trong hashtable. Thuc tnh tr v mt ICollection cha nhng gi tr trong hashtable. Thm mt thnh phn mi vi kha v gi tr xc nh. Xa tt c i tng trong hashtable. Ch mc cho hastable To ra mt bn sao Xc nh xem mt thnh phn c trong hashtable. Xc nh xem hashtablec cha mt kha xc nh Sao chp nhng thnh phn ca hashtablen mng mt chiu tn ti Tr v mt enumeratorcho hashtable. Thc thi ISerializablev tr v d liu cn thit lu tr. Thc thi ISerializablev pht sinh s kin
deserializationkhi
hon thnh. Xa mt thnh phn vi kha xc nh. Bng 9.6: Phng thc v thuc tnh ca lp Hashtable.
Trong mt Hashtable, mi gi tr c lu tr trong mt vng. Mi vng c nh s tng t nh l tng offset trong mng. Do kha c th khng phi l s nguyn, nn phi chuyn cc kha thnh cc kha s nh x n vng gi tr c nh s. Mi kha phi cung cp phng thc GetHashCode() nhn gi tr m ha thnh s ca n. Chng ta nh rng mi th trong C# u c dn xut t lp object. Lp object cung cp mt phng thc o l GetHashCode(), cho php cc lp dn xut t do k tha hay vit li. Vic thc thi thng thng ca phng thc GetHashCode() i vi chui th n gin bng cch cng cc gi tr Unicode ca tng k t li ri sau s dng ton t chia ly d nhn li mt gi tr t 0 n s vng c phn ca hashtable. Ta khng cn phi vit li phng thc ny vi kiu chui. Khi chng ta thm gi tr vo Hashtableth Hashtable s gi phng thc GetHashCode() cho mi gi tr m chng ta cung cp. Phng thc ny tr v mt s nguyn, xc nh vng m gi tr c lu tr trong hashtable.D nhin l c th nhiu gi tr nhn chung mt kha tc l cng mt vng trong hashtable, iu ny gi l s xung t. C mt vi cch
gii quyt s xung t ny. Trong cch chung nht v c h tr bi CLR l cho mi vng duy tr mt danh sch c th t cc gi tr. Khi chng ta truy cp mt gi tr trong hashtable, chng ta cung cp mt kha. Mt ln na Hashtable gi phng thc
GetHashCode() trn
kha v s dng gi tr tr v tm vng tng ng. Nu ch c mt gi tr th n s tr v, nu c nhiu hn hai gi tr th vic tm kim nh phn s c thc hin trn nhng ni dung ca vng . Bi v c mt vi gi tr nn vic tm kim ny thc hin thng thng l rt nhanh. Kha trong Hashtable c th l kiu d liu nguyn thy hay l cc th hin ca cc kiu d liu do ngi dng nh ngha (cc lp cho ngi lp trnh to ra). Nhng i tng c s dng lm kha trong hashtable phi thc thi GetHashCode() v Equals(). Trong hu ht trng hp, chng ta c th s dng k tha t Object.
tnh public l Item. Thuc tnh Item truy cp mt gi tr thng qua mt kha xc nh. Trong ngn ng C# thuc tnh Itemc khai bo nh sau:
objectthis[objectkey] {get;set;}
Thuc tnh Itemc thc thi trong ngn ng C# vi ton t ch mc ([]). Do vy chng ta c th truy cp nhng item trong bt c i tng t in bng c php ging nh truy cp mng. V d 9.17 minh ha vic thm mt item vo trong bng Hashtable v sau truy cp li chng thng qua thuc tnh Item. V d 9.17: thuc tnh Item tng nh nh ton t offset. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Collections; publicclassTester { staticvoidMain() { //tovkhitohashtable HashtablehashTable=newHashtable(); hashTable.Add(00440123,NgocThao); hashTable.Add(00123001,MyTien); hashTable.Add(00330124,ThanhTung); //truycpquathuctnhItem
Console.WriteLine(myHashtable[\00440123\]:{0}, hashTable[00440123]);
} } }
----------------------------------------------------------------------------Kt qu:
hashTable[00440123]: Ngoc Thao
----------------------------------------------------------------------------V d 9.17 bt u bng vic to mt bng Hashtablemi, s dng cc gi tr mc nh ca dung lng, phng thc to m bm v phng tc so snh. Tip sau l vic thm 3 b gi tr vo theo th t kha/gi tr. Sau khi cc item c thm vo chng ta c th ly gi tr thng qua kha vi cch thc dng ton t offset.
Tp kha v tp gi tr
Cc kiu t cung cp thm hai thuc tnh l thuc tnh Keys, v thuc tnh Values. Trong Keystruy cp i tng ICollectionvi tt c nhng kha trong Hashtable, v Valuestruy cp i tng ICollectionvi tt c gi tr. V d 9.18 minh ha nh sau. V d 9.18 Tp kha v tp gi tr. ----------------------------------------------------------------------------namespaceProgrmming_CSharp { usingSystem; usingSystem.Collections; publicclassTester { staticvoidMain() { //tovkhitohashtable HashtablehashTable=newHashtable(); hashTable.Add(00440123,NgocThao); hashTable.Add(00123001,MyTien); hashTable.Add(00330124,ThanhTung); //nhntpkha ICollectionkeys=hashTable.Keys; //nhptpgitr ICollectionvalues=hashTable.Values; //xuttpkha
foreach(stringsinkeys) {
----------------------------------------------------------------------------Kt qu:
00123001 00440123 00330124 My Tien Ngoc Thao Thanh Tung
----------------------------------------------------------------------------Mc d th t ca keyskhng c m bo theo th t nhng chng m bo rng cng vi th t a ra ca gi tr. Nh chng ta thy trn kha 00123001 tng ng vi MyTien,...
//tovkhitohashtable HashtablehashTable=newHashtable(); hashTable.Add(00440123,NgocThao); hashTable.Add(00123001,MyTien); hashTable.Add(00330124,ThanhTung); Console.WriteLine(hashTable);Console.WriteLine(Count: {0},hashTable.Count); Console.WriteLine(KeysandValues:); Print(hashTable); } publicstaticvoidPrint(Hashtabletable) { IDictionaryEnumeratorenumerator=table.GetEnumerator(); while(enumerator.MoveNext()) { Console.WriteLine(\t{0}:\t{1},enumerator.Key, enumerator.Value); } Console.WriteLine(); } } }
----------------------------------------------------------------------------Kt qu:
hashTableg Count: 3 00123001: 00440123: 00330124: My Tien Ngoc Thao Thanh Tung Keys and Values:
-----------------------------------------------------------------------------
Cu hi v tr li
Cuhi 1: iu phn bit gia mng v cc thnh phn bn trong mt mng? Tr li 1: Mng l kiu d liu tham chiu, cn cc thnh phn bn trong mng c cp pht da theo kiu d liu ca chng. Do vy mt mng ca kiu d liu
tham chiu s khng cha gi tr g c m ch tham chiu n nhng thnh phn c to ra trn heap. Cuhi 2: Mt lp c b ch mc khc mt mng nh th no?
Tr li 2: Hon ton khc nhau, mt mng ch n thun l mt i tng tham chiu n nhng i tng khc cng kiu d liu. Trong khi mt lp c b ch mc th n cha mt mng cc gi tr no , v cho php bn ngoi truy cp mng ny thng qua b ch mc. Mt lp nh vy khng ch c mt mng n thun m cn c nhng thuc tnh khc, cc phng thc...Ni chung l nu ta ch cn thao tc n thun trn tng phn rin l ca mt mng th nn dng mng. Cn nu chng ta cn thc hin mt s chc nng no c lin quan ti mt mng th ta c th xy dng mt lp c cha mt mng v h tr b ch mc. Cu hi 3: Giao din tp hp l g? C phi .NET cung cp mt s giao din chun hay khng? Tr li 3: Giao din tp hp cng l mt giao din nhng n ch a ra cc quy nh thao tc trn tp hp nh: so snh, lit k trn tp hp, to cc tp hp... NET cung cp mt s giao din cho tp hp nh: IEnumerable, ICollection, IComparer, IList....
Cu hi thm
Cuhi 1: T kho params c s dng lm g? Cuhi 2: ngha ca lnh lp foreach? Lnh ny c s dng vi kiu d liu no? Cuhi 3: C my kiu mng a chiu trong ngn ng C#. Hy cho bit tng loi v khi no th s dng tng loi cho thch hp. Cuhi 4: Cch to ra mng a chiu khng cng kch thc? Cuhi 5: Hy cho bit s khc nhau gia hai cch gi Arr[i][j] v Arr[i, j]? Cu hi 6: C th dng lnh foreach xut ra tt c cc thnh phn ca mng a chiu khng cng kch thc hay khng? Nu c th phi lm nh th no? Cuhi 7: Kiu d liu no c th lm ch mc trong b ch mc ca mt lp? Cuhi 8: Lm th no bit kch thc ca mt mng? Cu hi 9: Lit k nhng giao din tp hp m .NET cung cp? Cho bit ngha ca tng giao din? Cu hi 10: C cch no to mt mng m khng cn khai bo trc kch thc ca mng? V trong qu trnh thc hin trn mng chng ta c th tng ng kch thc ca mng hay khng? Cu hi 11: Nu mng c 31 phn t th dung lng ca i tng ArrayList l bao nhiu? Trng hp c 33 phn t? Cu hi 12: Hng i l g? Chng c sp xp theo kiu th t no? ng dng ca hng i ? Cu hi 13: Ngn xp l g? Chng c sp xp theo kiu th t no? ng dng ca ngn xp? Cuhi 14: Phng thc Peek() trong hng i v ngn xp c ngha g? Cu hi 15: Kiu d liu no cho php truy cp mt gi tr thng qua kha ca n? Lp no trong .NET h tr kiu d liu ny?
Cuhi 16: Cch ly tp gi tr trong mt i tng Hashtable? Cuhi 17: Cch ly tp kha trong mt i tng Hastable? Cuhi 18: Kha c phi l duy nht trong mt Hastable hay khng? Cu hi 19: Nu hai vng c chung mt kha th chng c tm kim theo kiu no? V tc tm kim? Cuhi 20: Hashtable thc thi cc giao din tp hp no? Cuhi 21: Phng thc no thc hin vic to cc kho trong mt Hashtable?
Bi tp
Bi tp 1: Vit mt chng trnh to mt mng mt chiu nguyn cha gi tr ngu nhin. Sp xp cc thnh phn trong mng theo th t tng dn v hin th kt qu. Lm tng t vi trng hp sp xp mng theo th t gim dn. Bi tp 2: Vit mt chng trnh to mt mng mt chiu nguyn cha gi tr ngu nhin. Sp xp chng theo th t s m th tng cn s dng th gim dn. Hin th kt qu ra mn hnh. Bi tp 3: Vit mt chng trnh tm s ln nht v nh nht trong mng hai chiu c kch thc c nh. Cc thnh phn ca mng c pht sinh ngu nhin. Bi tp 4: Vit chng trnh cng hai ma trn nxm, tc l mng hai chiu c kch thc n dng, m ct. Cc gi tr ca hai mng pht sinh ngu nhin, cho bit kt qu cng hai ma trn? Bi tp 4: Vit chng trnh cho php ngi dng nhp vo mt ma trn nxm, sao tm kim mt gi tr no theo yu cu ngi dng, kt qu ca vic tm kim l gi tr v th t ca gi tr tm c trong ma trn. Bi tp5: Vit chng trnh to mt mng hai chiu khng cng kch thc. C nh s dng ca mng l 5, cn tng dng c kch thc bng gi tr ca dng, t l dng th nht c kch thc 1 (tc l c 1 ct), dng th hai c kch thc l 2 (tc l 2 ct).... Cc gi tr pht sinh ngu nhin. Hy xut kt qu ca ma trn theo kiu sau: a[i][j] = <gi tr aij> ... Vic xut kt qu ca ma trn trn c th thc hin bng vng lp foreach c khng? Nu c th hy vit on chng trnh xut ra kt qu? Bi tp 6: Vit chng trnh to ra mt mng lu tr 30 im s ca hc sinh. Tnh trung bnh im ca tt c hc sinh. Xut kt qu tng im v im trung bnh. Bi tp 7: Vit mt chng trnh to ra mt lp tn l LopHoc, trong c khai bo b ch mc ch n tn ca tng hc vin trong lp. Cho php mt lp c ti a 30 hc vin. To chng trnh minh ha cho php ngi dng nhp vo tn ca tng hc vin. Xut kt qu
Bi tp 8: Vit chng trnh s dng ArrayList to mt mng. Chng trnh to ra mt vng lp cho php ngi dng nhp vo cc gi tr cho mng. Hy xut kt qu mng cng vi gi tr Count, v Capacity ca mng. Ta c th thit lp gi tr Capacity nh hn gi tr Count c khng? Bi tp9: Vit chng trnh to ra i tng Queue tn l myQueue. Khi to myQueue c 5 gi tr ngu nhin. Hy thc hin cc bc sau, mi bc thc hin phi xut tnh trng ca myQueue: 1. Ly mt gi tr ra. 2. Ly tip mt gi tr na. 3. Xem mt gi tr u queue. 4. a vo queue mt gi tr. Bi tp 10: Vit chng trnh to i tng Stack tn l myStack. Khi to myStack c 5 gi tr ngu nhin. Hy thc hin cc bc sau, mi bc thc hin phi xut tnh trng ca myStack: 1. Ly mt gi tr ra. 2. Ly tip mt gi tr na. 3. Xem mt gi tr u stack. 4. a vo stack mt gi tr. Bi tp 11: Vit chng trnh s dng kiu d liu t in qun l thng tin ca mt lp hc. Trong kha l chui m s hc vin cn gi tr l tn ca hc vin. Vit chng trnh minh ha cho php nhp vo 10 hc vin, v cho php ngi dng tm kim tn ca hc vin thng qua m s hc vin.
Chng 10
X L CHUI
Lp i tng string
To mt chui To chui dng phng thc ToString Thao tc trn chui Tm mt chui con Chia chui Thao tc trn chui dng StringBuilder
Cu hi & bi tp
C mt thi gian ngi ta lun ngh rng my tnh ch dnh ring cho vic thao tc cc gi tr dng s. Cc my tnh u tin l c thit k s dng tnh ton s lng ln nh tnh ton qu o ca tn la trong quc phng. V ngn ng lp trnh c ging dy khoa ton ca cc i hc ln. Ngy nay, hu ht cc chng trnh lin quan n nhiu chui k t hn l cc chui cc con s. Thng thng cc chui c s dng cho vic x l t ng, thao tc trn cc su liu, v to ra cc trang web. Ngn ng C# h tr kh y cc chc nng ca kiu chui m chng ta c th thy c cc ngn ng lp trnh cp cao khc. iu quan trng hn l ngn ng C# xem nhng chui nh l nhng i tng v c ng gi tt c cc thao tc, sp xp, v cc phng thc tm kim thng c p dng cho chui k t. Nhng thao tc chui phc tp v so khp mu c h tr bi vic s dng cc biu thc quy tc (regular expression). Ngn ng C# kt hp sc mnh v s phc tp ca c php 521
X L Chui
biu
522
X L Chui
thc quy tc, (thng thng ch c tm thy trong cc ngn ng thao tc chui nh Awk, Perl), vi mt thit k hng i tng y . Trong chng 10 ny chng ta s hc cch lm vic vi kiu d liu string ca ngn ng C#, kiu string ny chnh l mt alias ca lp System.String ca .NET Framework. Chng ta cng s thy c cch rt trch ra chui con, thao tc v ni cc chui, xy dng mt chui mi vi lp StringBuilder. Thm vo , chng ta s c hc cch s dng lp Regex so khp cc chui da trn biu thc quy tc phc tp.
Lp i tng String
C# xem nhng chui nh l nhng kiu d liu c bn tc l cc lp ny rt linh hot, mnh m, v nht l d s dng. Mi i tng chui l mt dy c nh cc k t Unicode. Ni cch khc, cc phng thc c dng lm thay i mt chui thc s tr v mt bn sao thay i, chui nguyn thy khng thay i. Khi chng ta khai bo mt chui C# bng cch dng t kha string, l chng ta khai bo mt i tng ca lp
System.String,
l mt trong nhng kiu d liu c xy dng sn c cung cp bi th vin lp .NET (.NET Framework Class Library). Do mt kiu d liu chui C# l kiu d liu System.String, v trong sut chng ny dng hai tn hon i ln nhau. Khai bo ca lp System.Stringnh sau:
publicsealedclassString:IComparable,ICloneble,IConvertible
Khai bo ny cho thy lp String c ng du l khng cho php k tha, do chng ta khng th dn xut t lp ny c. Lp ny cng thc thi ba giao din h thng l IComparable, ICloneable, v IConvertible giao din ny cho php lp
System.Stringchuyn
Nh chng ta xem trong chng 9, giao din IComparablec thc thi bi cc kiu d liu c sp xp. V d nh chui th theo cch sp xp Alphabe. Bt c chui no a ra cng c th c so snh vi chui khc ch ra rng chui no c th t trc. Nhng lp IComparablethc thi phng thc CompareTo(). Nhng i tng ICloneable c th to ra nhng th hin khc vi cng gi tr nh l th hin nguyn thu. Do ta c th to ra mt chui mi t chui ban u v gi tr ca chui mi bng vi chui ban u. Nhng lp ICloneablethc thi phng thc Clone(). Nhng lp IConvertiblecung cp phng thc d dng chuyn i qua cc kiu d liu c bn khc nh l ToInt32(), ToDouble(), ToDecimal(),...
To mt chui
Cch ph bin nht to ra mt chui l gn cho mt chui trch dn tc l chui nm trong du ngoc kp, kiu chui ny cng c bit nh l mt chui hng, khai bo nh sau:
stringnewString=Daylachuoihang;
Nhng chui trch dn c th c thm cc k t escape, nh l \n hay \t, k t ny bt u vi du cho ngc (\), cc k t ny c dng ch ra rng ti v tr xung dng
hay tab c xut hin. Bi v du gch cho ngc ny cng c dng trong vi c php dng lnh, nh l a ch URLs hay ng dn th mc, do trong chui trch dn du cho ngc ny phi c t trc du cho ngc khc, tc l dng hai du cho ngc trong trng hp ny. Chui cng c th c to bng cch s dng chui c nh hay nguyn vn (verbatim), tc l cc k t trong chui c gi nguyn khng thay i. Chui ny c bt u vi biu tng @. Biu tng ny bo vi hm khi dng ca lp String rng chui theo sau l nguyn vn, thm ch n cha nhiu dng hoc bao gm nhng k t escape. Trong chui nguyn vn, k t cho ngc v nhng k t sau n n gin l nhng k t c thm vo chui. Do vy, ta c 2 nh ngha chui sau l tng ng vi nhau:
stringliteral1=\\\\MyDocs\\CSharp\\ProgrammingC#.cs; stringverbatim1=@\\MyDocs\CSharp\ProgrammingC#.cs;
Trong chui th nht, l mt chui bnh thng c s dng, do du k t cho l k t escape, nn n phi c t trc mt k t cho ngc th hai. Trong khai bo th hai chui nguyn vn c s dng, nn khng cn phi thm k t cho ngc. Mt v d th hai minh ha vic dng chui nguyn vn:
stringliteral2=Dongmot\ndonghai;string verbatim2=@Dongmot donghai;
Ni chung ta ta c th s dng qua li gia hai cch nh ngha trn. Vic la chn ph thuc vo s thun tin trong tng trng hp hay phong cch ring ca mi ngi.
Lp Stringca .NET cung cp rt nhiu b khi dng h tr rt nhiu k thut khc nhau gn nhng gi tr chui n kiu d liu chui. Mt vi b khi dng c th cho php
chng ta to mt chui bng cch truyn vo mt mng k t hoc mt con tr k t. Truyn mt mng chui nh l tham s n b khi dng ca String l to ra mt th hin CLR- compliant (mt th hin ng theo yu cu ca CLR). Cn vic truyn mt con tr chui nh mt tham s ca b khi dng Stringl vic to mt th hin khng an ton (unsafe).
ngha Trng publicstaticth hin mt chui rng. Phng thc publicstatic so snh hai chui. Phng thc publicstatic so snh hai chui khng quan tm n th t. Phng thc publicstatic to chui mi t mt hay nhiu chui. Phng thc public static to ra mt chui mi bng sao t chui khc. Phng thc public static kim tra xem hai chui c cng gi tr hay khng. Phng thc public static nh dng mt chui dng k t lnh nh dng xc nh. Phng thc publicstatic tr v tham chiu n th hin cathci. Phng chu publicstatictr v tham chiu ca chui Phng thc public static kt ni cc chui xc nh gia mi thnh phn ca mng chui. Indexer ca chui. Chiu di ca chui. Tr v chui. So snh hai chui. Sao chp mt s cc k t xc nh n mt mng k t Unicode. ca chui xc nh ph hp vi chui a Ch ra v tr ra. Tr v chui mi c chn mt chui xc nh. Ch ra v tr xut hin cui cng ca mt chui xc nh trongphinhng k t trong chui, chn vo Canh l chu i. bn tri khong trng hay k tk trong chui, chn vo Canh l tri nhng cc t xc nh. bn phi khong trng hay cc k t xc nh.
Remove() Split() StartWidth() SubString() ToCharArray() ToLower() ToUpper() Trim() TrimEnd() TrimStart()
Xa i mt s k t xc nh. Tr v chui c phn nh bi nhng k t xc nh trong chuii.c bt u bng mt s k t xc nh Xem chu hay khng.t chui con. Ly m Sao chp nhng k t t mt chui n mng k t. Tr v bn sao ca chui kiu ch thng. Tr v bn sao ca chui kiu ch hoa. Xa b tt c s xut hin ca tp hp k t xc nh t vnh nhng tr cui. cng trong chui. Xa tr u tin vn v tr cui
Xa nh Trimnhng v tr u. Bng 10.1 : Phng thc v thuc tnh ca lp String Trong v d 10.1 sau y chng ta minh ha vic s dng mt s cc phng thc ca chui nh Compare(), Concat() (v dng ton t +), Copy() (v dng ton t =),
Insert(), EndsWith(),
v ch mc IndexOf.
V d 10.1 : Lm vic vi chui. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassStringTester { staticvoidMain() { //khitomtschuithaotcstring s1=abcd; strings2=ABCD; strings3=@TrungTamDaoTaoCNTT ThanhphoHoChiMinhVietNam; intresult; //Sosnhhaichuivinhaucphnbitchthngvchhoaresult= string.Compare(s1,s2); Console.WriteLine(SosanhhaichuoiS1:{0}vS2:{1}ketqua:{2}\n,s1,s2,result); //SdngtipphngthcCompare()nhngtrnghpnykhngbit
//chthnghaychhoa
//Thamsthbaltruesbquakimtraktthnghoa result=string.Compare(s1,s2,true);Console.WriteLine(Khongphan bietchuthuongvahoa\n); Console.WriteLine(S1:{0},S2:{1},ketqua:{2}\n,s1,s2,result); //phngthcniccchui strings4=string.Concat(s1,s2); Console.WriteLine(ChuoiS4noituchuoiS1vaS2:{0},s4); //sdngnpchngtont+ strings5=s1+s2; Console.WriteLine(ChuoiS5duocnoituchuoiS1vaS2:{0},s5); //Sdngphngthccopychuistring s6=string.Copy(s5); Console.WriteLine(S6duocsaocheptuS5:{0},s6); //Sdngnpchngtont= strings7=s6; Console.WriteLine(S7=S6:{0},s7); //Sdngbacchsosnhhaichui //Cch1sdngmtchuisosnhvichuicnli Console.WriteLine(S6.Equals(S7)?:{0},s6.Equals(s7)); //Cch2dnghmcalpstringsosnhhaichui Console.WriteLine(Equals(S6,s7)?:{0},string.Equals(s6,s7)); //Cch3dngtontsosnh Console.WriteLine(S6==S7?:{0},s6==s7); //Sdnghaithuctnhhaydnglchmcvchiudicachui Console.WriteLine(\nChuoiS7cochieudaila:{0},s7.Length); Console.WriteLine(Kytuthu3cuachuoiS7la:{0},s7[2]); //Kimtraxemmtchuicktthcvimtnhmk //txcnhhaykhng Console.WriteLine(S3:{0}\nketthucvoichuCNTT?:{1}\n,s3, s3.EndsWith(CNTT)); Console.WriteLine(S3:{0}\nketthucvoichuNam?:{1}\n,s3, s3.EndsWith(Nam)); //Trvchmccamtchuicon
Consol e.Write Line(\n Timvi trixuat hien dau tiencua chu CNTT ); Consol e.Write Line(tr ong chuoi S3l {0}\n, s3.Inde xOf(C NTT)); //Chn tnhn lcvo trc CNTT trong chui S3 string s8= s3.Inse
rt(18,nhanluc);Console.WriteLine(S8:{0}\n,s8);
}//endnamespace
----------------------------------------------------------------------------Kt qu:
So sanh hai chuoi S1: abcd v S2: ABCD ket qua: -1 Khong phan biet chu thuong va hoa S1: abcd , S2: ABCD, ket qua : 0 Chuoi S4 noi tu chuoi S1 va S2: abcdABCD Chuoi S5 duoc noi tu chuoi S1 + S2: abcdABCD S6 duoc sao chep tu S5: abcdABCD S7 = S6: abcdABCD S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6 == S7 ?: True Chuoi S7 co chieu dai la : 8 Ky tu thu 3 cua chuoi S7 la : c S3: Trung Tam Dao Tao CNTT Thanh pho Ho Chi Minh Viet Nam ket thuc voi chu CNTT ? : False S3: Trung Tam Dao Tao CNTT Thanh pho Ho Chi Minh Viet Nam ket thuc voi chu Minh ? : True Tim vi tri xuat hien dau tien cua chu CNTT trong chuoi S3 l 18 S8 : Trung Tam Dao Tao nhan luc CNTT Thanh pho Ho Chi Minh Viet Nam S9 : Trung Tam Dao Tao nhan luc CNTT Thanh pho Ho Chi Minh Viet Nam
----------------------------------------------------------------------------Nh chng ta xem on chng trnh minh ha trn, chng trnh bt u vi ba khai bo chui:
strings1=abcd; strings2=ABCD;
strings3=@TrungTamDaoTaoCNTTThanh phoHoChiMinhVietNam;
Hai chui u s1v s2c khai bo chui k t bnh thng, cn chui th ba c khai bo l chui nguyn vn (verbatim string) bng cch s dng k hiu @ trc chui. Chng trnh bt u bng vic so snh hai chui s1 v s2. Phng thc Compare() l phng thc tnh ca lp string, v phng thc ny c np chng. Phin bn u tin ca phng thc np chng ny l ly hai chui v so snh chng vi nhau:
//Sosnhhaichuivinhaucphnbitchthngvchhoaresult= string.Compare(s1,s2); Console.WriteLine(Sosanhhaichuois1:{0}vs2:{1}ketqua:{2}\n,s1,s2,result);
y vic so snh c phn bit ch thng v ch hoa, phng thc tr v cc gi tr khc nhau ph thuc vo kt qu so snh: Mt s m nu chui u tin nh hn chui th hai Gi tr 0 nu hai chui bng nhau Mt s dng nu chui th nht ln hn chui th hai. Trong trng hp so snh trn th a ra kt qu l chui s1 nh hn chui s2. Trong Unicode cng nh ASCII th th t ca k t thng nh hn th t ca k t hoa:
SosanhhaichuoiS1:abcdvS2:ABCDketqua:1
Cch so snh th hai dng phin bn np chng Compare()ly ba tham s. Tham s Boolean quyt nh b qua hay khng b qua vic so snh phn bit ch thng v ch hoa. Tham s ny c th b qua. Nu gi tr ca tham s l true th vic so snh s b qua s phn bit ch thng v ch hoa. Vic so snh sau s khng quan tm n kiu loi ch:
//Thamsthbaltruesbquakimtraktthnghoaresult= string.Compare(s1,s2,true); Console.WriteLine(Khongphanbietchuthuongvahoa\n);Console.WriteLine(S1: {0},S2:{1},ketqua:{2}\n,s1,s2,result);
V d minh ha 10.1 trn tip tc vi vic ni cc chui li vi nhau. y s dng hai cch ni lin hai chui. Chng ta c th s dng phng thc Concat() y l phng thc
publicstaticca string:
strings4=string.Concat(s1,s2);
Hay cch khc n gin hn l vic s dng ton t ni hai chui (+):
strings5=s1+s2;
Trong c hai trng hp th kt qu ni hai chui hon ton thnh cng v nh sau:
ChuoiS4noituchuoiS1vaS2:abcdABCD ChuoiS5duocnoituchuoiS1+S2:abcdABCD
Tng t nh vy, vic to mt chui mi c th c thit lp bng hai cch. u tin l chng ta c th s dng phng thc staticCopy()nh sau:
strings6=string.Copy(s5);
Hoc thun tin hn chng ta c th s dng phng thc np chng ton t (=) thng qua vic sao chp ngm nh:
strings7=s6;
Lp String ca .NET cung cp ba cch kim tra bng nhau gia hai chui. u tin l chng ta c th s dng phng thc np chng Equals() kim tra trc tip rng S6 c bng S7hay khng:
Console.WriteLine(S6.Equals(S7)?:{0},S6.Equals(S7));
K thut so snh th hai l truyn c hai chui vo phng thc Equals()ca string:
Console.WriteLine(Equals(S6,s7)?:{0},string.Equals(S6,S7));
V phng php cui cng l s dng np chng ton t so snh (=) ca String:
Console.WriteLine(S6==S7?:{0},s6==s7);
Vic so snh bng nhau gia hai chui l vic rt t nhin v thng c s dng. Tuy nhin, trong mt s ngn ng, nh VB.NET, khng h tr np chng ton t. Do chc chn chng ta nn s dng phng thc Equals()l tt nht. Cc on chng trnh tip theo ca v d 10.1 s dng ton t ch mc ([]) tm ra k t xc nh trong mt chui. V dng thuc tnh Length ly v chiu di ca ton b mt chui:
Console.WriteLine(\nChuoiS7cochieudaila:{0},s7.Length); Console.WriteLine(Kytuthu3cuachuoiS7la:{0},s7[2]);
Kt qu l:
ChuoiS7cochieudaila:8
Kytuthu3cuachuoiS7la:c
Phng thc EndsWith() hi xem mt chui c cha mt chui con v tr cui cng hay khng. Do vy, chng ta c th hi rng chui S3 c kt thc bng chui CNTT hay chui Nam:
//Kimtraxemmtchuicktthcvimtnhmktxcnhhaykhng
Kt qu tr v l ln kim tra u tin l sai do chui S3khng kt thc ch CNTT, v ln kim tra th hai l ng:
S3:TrungTamDaoTaoCNTT ThanhphoHoChiMinhVietNamket thucvoichuCNTT?:False S3:TrungTamDaoTaoCNTT ThanhphoHoChiMinhVietNamket thucvoichuMinh?:True
Phng thc IndexOf() ch ra v tr ca mt con bn trong mt chui (nu c). V phng thc Insert()chn mt chui con mi vo mt bn sao chp ca chui ban u. on lnh tip theo ca v d minh ha thc hin vic xc nh v tr xut hin u tin ca chui CNTT trong chui S3:
Console.WriteLine(\nTimvitrixuathiendautiencuachuCNTT); Console.WriteLine(trongchuoiS3l{0}\n,s3.IndexOf(CNTT));
V kt qu tm c l 18:
TimvitrixuathiendautiencuachuCNTT trongchuoiS3l18
Chng ta c th chn vo chui t nhan luc v theo sau chui ny l mt khong trng vo trong chui ban u. Khi thc hin th phng thc tr v bn sao ca chui c chn vo chui con mi v c gn li vo chui S8:
strings8=s3.Insert(18,nhanluc); Console.WriteLine(S8:{0}\n,s8);
Kt qu a ra l:
S8:TrungTamDaoTaonhanlucCNTT ThanhphoHoChiMinhVietNam
Cui cng, chng ta c th kt hp mt s cc php ton thc hin vic chn nh sau:
strings9=s3.Insert(s3.IndexOf(CNTT),nhanluc); Console.WriteLine(S9:{0}\n,s9);
ThanhphoHoChiMinhVietNam
Tm mt chui con
Trong kiu d liu String c cung cp phng thc Substring() trch mt chui con t chui ban u. C hai phin bn u dng mt ch mc xc nh v tr bt u trch ra. V mt trong hai phin bn dng ch mc th hai lm v tr kt thc ca chui. Trong v d 10.2 minh ha vic s dng phng thc Substring()ca chui. V d 10.2 : S dng phng thc Substring(). ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text; publicclassStringTester { staticvoidMain() { //Khaiboccchuisdng strings1=Mothaibabon; intix; //lychscakhongtrngcuicngix= s1.LastIndexOf(); //lytcuicng strings2=s1.Substring(ix+1); //thitlplichuis1tvtr0nvtrix //dos1cgitrmilmothaibas1= s1.Substring(0,ix); //tmchscakhongtrngcuicng(sauhai) ix=s1.LastIndexOf(); //thitlps3lchuiconbtutvtrix //dos3=ba strings3=s1.Substring(ix+1); //thitlplis1btutvtr0ncuivtrix //s1=mothai s1=s1.Substring(0,ix); //ixchnkhongtrnggiamotvahai ix=s1.LastIndexOf(); //tora s4l chui conbt ut sauv trix, do //vy cgi trl hai string s4= s1.Sub string(i x+1); //thit lpli gitr cas1
s1=s1.Substring(0,ix); //lychscakhongtrngcuicng,lcnyixl1 ix=s1.LastIndexOf(); //torachuis5btutchskhongtrng,nhngkhngckhong //trngvixl1nnchuibtut0 strings5=s1.Substring(ix+1);Console.WriteLine(s2:{0}\n s3:{1},s2,s3);Console.WriteLine(s4:{0}\ns5:{1}\n,s4, s5);Console.WriteLine(s1:{0}\n,s1); }//endMain }//endclass }//endnamespace
----------------------------------------------------------------------------Kt qu:
s2 : bon s3 : ba s4 : hai s5 : mot s1 : mot
----------------------------------------------------------------------------V d minh ha 10.2 trn khng phi l gii php tt gii quyt vn trch ly cc k t trong mt chui. Nhng n l cch gn ng tt nht v minh ha hu dng cho k thut ny.
Chia chui
Mt gii php gii quyt hiu qu hn minh ha cho v d 10.2 l c th s dng phng thc Split()ca lp string. Chc nng chnh l phn tch mt chui ra thnh cc chui con. s dng Split(), chng ta truyn vo mt mng cc k t phn cch, cc k t ny c dng chia cc t trong chui. V phng thc s tr v mt mng nhng chui con. V d 10.3 : S dng phng thc Split(). ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text; publicclassStringTester
{ staticvoidMain()
{ //toccchuilmvic strings1=Mot,hai,baTrungTamDaoTaoCNTT; //torahngktkhongtrngvduphyconst charSpace=; constcharComma=,; //toramngphncchchar[] delimiters=newchar[] { Space, Comma }; stringoutput=; intctr=1; //thchinvicchiamtchuidngvnglp //aktquvomngccchui foreach(stringsubStringins1.Split(delimiters)) { output+=ctr++; output+=:; output+=subString; output+=\n; }//endforeach Console.WriteLine(output); }//endMain }//endclass }//endnamespace 7: Tam 8: Dao 9: Tao
----------------------------------------------------------------------------Kt qu:
1: Mot 2: 3: hai 4: 5: ba 6: Trung
10: CNTT
----------------------------------------------------------------------------on chng trnh bt u bng vic to mt chui minh ha vic phn tch:
strings1=Mot,hai,baTrungTamDaoTaoCNTT;
Hai k t khong trng v du phy c dng lm cc k t phn cch. Sau phng thc
Split()
foreach(stringsubStringins1.Split(delimiters))
Chui output cha cc chui kt qu c khi to l chui rng. y chng ta to ra chui output bng bn bc. u tin l ni gi tr ca bin m ctr, tip theo l thm du hai chm, ri a chui c chia ra t chui ban u, v cui cng l thm k t qua dng mi. V bn bc trn c c lp n khi no chui khng cn chia ra c. C mt vn cn ni l kiu d liu string khng c thit k cho vic thm vo mt chui nh dng sn to ra mt chui mi trong mi vng lp trn, nn chng ta mi phi thm vo tng k t nh vy. Mt lp StringBuilder c to ra phc v cho nhu cu thao tc chui tt hn.
Phng thc
Capacity() Chars() Length() MaxCapacity() Append() AppendFormat() EnsureCapacity() Insert() Replace()
bn sao. V d minh ha 10.4 thay th i tng Stringbng mt i tng StringBuilder. V d minh ha 10.4 : S dng chui StringBuilder. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text; publicclassStringTester { staticvoidMain() { //khitochuisdng strings1=Mot,hai,baTrungTamDaoTaoCNTT; //torahngktkhongtrngvduphyconst charSpace=; constcharComma=,; //toramngphncchchar[] delimiters=newchar[] { Space, Comma }; // s dng StringBuilder to chui output StringBuilderoutput=newStringBuilder();intctr= 1; //chiachuivdngvnglpaktquvo //mngccchui foreach(stringsubStringins1.Split(delimiters)) { //AppendFormatnimtchuicnhdng output.AppendFormat({0}:{1}\n,ctr++,subString); }//endforeach Consol e.Write Line(o utput);
} } }
----------------------------------------------------------------------------Chng ta ch thay phn cui ca on chng trnh 10.3. R rng vic s dng
StringBuilderthun
y chng ta s dng phng thc AppendFormat() ca StringBuilder ni thm mt chui c nh dng to ra mt chui mi. iu ny qu d dng v kh l hiu qu. Kt qu chng trnh thc hin cng tng t nh v d minh ha 10.3 dng String:
1: Mot 2: 3: hai 4: 5: ba 6: Trung 7: Tam 8: Dao 9: Tao 10: CNTT
chng ta c th tr v bt c hay tt c danh sch cc chui con (Mot, hai,...) v c th to ra cc phin bn chui c b sung ca nhng chui con (nh : TrUngTAM,...). Biu thc qui tc ny c quyt nh bi c php cc k t qui tc ca chnh bn thn n. Mt biu thc qui tc bao gm hai kiu k t: K t bnh thng (literal): nhng k t ny m chng ta s dng so khp vi chui k t ch. Metacharacter: l cc biu tng c bit, c hnh ng nh l cc lnh trong b phn tch (parser) ca biu thc. B phn tch l mt c ch c trch nhim hiu c cc biu thc qui tc. V d nu nh chng ta to mt biu thc qui tc nh sau:
^(From|To|Subject|Date):
Biu thc ny s so khp vi bt c chui con no vi nhng t nh From, To, Subject, v Date min l nhng t ny bt u bng k t dng mi (^) v kt thc vi du hai chm (:). K hiu du m (^) trong trng hp ny ch ra cho b phn tch biu thc qui tc rng chui m chng ta mun tm kim phi bt u t dng mi. Trong biu thc ny cc k t nh (,), v | l cc metacharacter dng nhm cc chui k t bnh thng nh From, To,Subject, v Date v ch ra rng bt c s la chn no trong s u c so khp ng. Ngoi ra k t ^ cng l k t metacharacter ch ra bt u dng mi. Tm li vi chui biu thc qui tc nh:
^(From|To|Subject|Date):
ta c th pht biu theo ngn ng t nhin nh sau: Ph hp vi bt c chui no bt u bng mt dng mi c theo sau bi mt trong bn ch From, To, Subject, Date v theo sau l k t du hai chm. Vic trnh by y v biu thc quy tc vt qu phm vi ca cun sch ny, do s a dng v kh phc tp ca n. Tuy nhin, trong phm vi trnh by ca chng 10 ny, chng ta s c tm hiu mt s cc thao tc ph bin v hu dng ca biu thc quy tc.
s dng mt s phng thc tnh trong v d minh ha 10.5. V d minh ha 10.5: S dng lp Regex. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text; usingSystem.Text.RegularExpressions; publicclassTester
//tochuibiuthcquytc RegextheRegex=newRegex(|,);StringBuilder sBuilder=newStringBuilder();intid =1; //sdngvnglplyccchuicon foreach(stringsubStringintheRegex.Split(s1)) { //nichuivatmctrongbiuthcquytc //vochuiStringBuildertheonhdngsn. sBuilder.AppendFormat({0}:{1}\n,id++,subString); } Console.WriteLine({0},sBuilder); }//endMain }//endclass }//endnamespace
----------------------------------------------------------------------------Kt qu:
1: Mot 2: hai 3: ba 4: Trung 5: Tam 6: Dao 7: Tao 8: CNTT
----------------------------------------------------------------------------V d minh ha bt u bng vic to mt chui s1, ni dung ca chui ny tng t nh chui trong minh ha 10.4.
strings1=Mot,hai,ba,TrungTamDaoTaoCNTT;
Tp theo mt biu thc quy tc c to ra, biu thc ny c dng tm kim mt chui:
RegextheRegex=newRegex(|,);
y mt b khi to np chng ca Regex ly mt chui biu thc quy tc nh l tham s ca n. iu ny gy ra s kh hiu. Trong ng cnh ca mt chng trnh C#, ci no l biu thc quy tc: chui c a vo b khi dng hay l i tng Regex? Tht s th chui k t c truyn vo chnh l biu thc quy tc theo ngha
truyn thng ca thut ng ny. Tuy nhin, theo quan im hng i tng ca ngn ng C#, i mc hay tham s ca b khi to ch n thun l chui k t, v chnh Regexmi l i tng biu thc quy tc!
Phn cn li ca chng trnh thc hin ging nh v d minh ha 10.4 trc. Ngoi tr vic gi phng thc Split() ca i tng Regex ch khng phi ca chui s1. Regex.Split() hnh ng cng tng t nh cch String.Split(). Kt qu tr v l mng cc chui, y chnh l cc chui con so khp tm c theo mu a ra trong theRegex. Phng thc Regex.Split() l phng thc c np chng. Phin bn n gin c gi trong th hin ca Regex c dng nh trong v d 10.5. Ngoi ra cn c mt phin bn tnh ca phng thc ny. Phin bn ny ly mt chui thc hin vic tm kim v mt mu so khp. Tip sau l minh ha 10.6 s dng phng thc tnh V d minh ha 10.6: S dng phng thc tnh Regex.Split(). ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text; usingSystem.Text.RegularExpressions; publicclassTester { staticvoidMain() { //tochuitmkim strings1=Mot,hai,baTrungTamDaoTaoCNTT; StringBuildersBuilder=newStringBuilder(); intid=1; //ykhngtothhincaRegexdosdngphng //thctnhcalpRegex. foreach(stringsubStrinRegex.Split(s1,|,)) { sBuilder.AppendFormat({0}:{1}\n,id++,subStr); } Console.WriteLine({0},sBuilder); } } }
-----------------------------------------------------------------------------
Kt qu ca v d minh ha 10.6 hon ton tng t nh minh ha 10.5. Tuy nhin trong chng trnh th chng ta khng to th hin ca i tng Regex. Thay vo chng ta s dng trc tip phng thc tnh ca Regex l Split(). Phng thc ny ly vo hai tham s,
tham s u tin l chui ch cn thc hin so khp v tham s th hai l chui biu thc quy tc dng so khp.
}//endclass }//endnamespace
----------------------------------------------------------------------------Kt qu:
Chieu dai: 5 Chuoi: Ngon Chieu dai: 4 Chuoi: ngu Chieu dai: 4 Chuoi: lap Chieu dai: 6 Chuoi: trinh Chieu dai: 2 Chuoi: C
v mt biu thc quy tc thc hin vic tm kim trn chui string1:
RegextheReg=newRegex(@(\S+)\s);
Chui \S tm k t khng phi k t trng v du cng ch ra rng c th c mt hay nhiu k t. Chui \s (ch thng) ch ra l khong trng. Kt hp li l tm mt chui khng c khong trng bn trong nhng theo sau cng l mt khong trng. Chng ta lu khai bo chui biu thc quy tc dng chui nguyn vn d dng dng cc k t escape nh (\). Kt qu c trnh by l nm t u tin c tm thy. T cui cng khng c tm thy bi v n khng c theo sau bi khong trng. Nu chng ta chn mt khong trng sau ch Sharp v trc du ngoc ng, th chng trnh s tm c thm ch Sharp. Thuc tnh Lengthl chiu di ca chui con tm kim c. Chng ta s tm hiu su hn v thuc tnh ny trong phn s dng lp CaptureCollection cui chng.
Lp Matchdn xut t nhm Group, v c mt tp hp gi l Groupscha tt c cc nhm m Matchtm thy. Vic to v s dng tp hp Groupsv lp Groupc minh ha trong v d 10.8 nh sau: V d minh ha 10.8: S dng lp Group. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text.RegularExpressions; classTester { publicstaticvoidMain() { stringstring1=10:20:30127.0.0.0Dolphin.net; //nhmthigianbngmthaynhiuconshaydu: //vtheosaubikhongtrng. RegextheReg=newRegex(@(?<time>(\d|\:)+)\s+ //achIPlmthaynhiuconshayduchmtheo //saubikhongtrng @(?<ip>(\d|\.)+)\s+ //achweblmthaynhiukt @(?<site>\S+)); //lymttphpccchuicsokhp MatchCollectiontheMatches=theReg.Matches(string1); //sdngvnglplyccchuitrongtphpforeach (MatchtheMatchintheMatches) { if(theMatch.Length!=0) { Console.WriteLine(\ntheMatch:{0},theMatch.ToString()); //hinththigian Console.WriteLine(Time:{0},theMatch.Groups[time]); //hinthachIP Console.WriteLine(IP:{0},theMatch.Groups[ip]); //hintha chwebsite Console.Writ eLine(Site: {0}, theMatch.Gro ups[site]);
}//endif }//endforeach
Chui ny c th c tm thy trong ni dung ca cc tp tin log ghi nhn cc thng tin web server hay t cc kt qu tm kim c trong c s d liu. Trong v d n gin ny c ba ct, mt ct u tin ghi nhn thi gian, ct th hai ghi nhn a ch IP, v ct th ba ghi nhn a ch web. Mi ct c ngn cch bi khong trng. D nhin l trong cc ng dng thc t ta phi gii quyt nhng vn phc tp hn na, chng ta c th cn phi thc hin vic tm kim phc tp hn v s dng nhiu k t ngn cch hn na. Trong v d ny, chng ta mong mun l to ra mt i tng Regex tm kim chui con yu cu v phn chng vo trong ba nhm: time, a ch IP, v a ch web. Biu thc quy tc y cng kh n gin, do cng d hiu. y chng ta quan tm n nhng k t to nhm nh:
<?<time>
Du ngoc n dng to nhm. Mi th gia du ngoc m trc du ? v du ngoc ng (trong trng hp ny sau du +) c xc nh l mt nhm. Chui ?<time> nh ra tn ca nhm v lin quan n tt c cc chui k t c so khp theo biu thc quy tc (\d|
\:)+)\s.
Biu thc ny c th c din gii nh: mt hay nhiu con s hay nhng du :
theo sau bi mt khong trng. Tng t nh vy, chui ?<ip>nh tn ca nhm ip, v ?<site>l tn ca nhm site. Tip theo l mt tp hp c nh ngha nhn tt c cc chui con c so khp nh sau:
MatchCollectiontheMatches=theReg.Matches(string1);
Vng lp foreachc dng ly ra cc chui con c tm thy trong tp hp. Nu chiu di Lengthca Match l ln hn 0, tc l tm thy th chng ta s xut ra chui c tm thy:
Console.WriteLine(\ntheMatch:{0},theMatch.ToString());
V kt qu ca v d l:
theMatch:10:20:30127.0.0.0Dolphin.net
Sau chng trnh ly nhm time t tp hp nhm ca Matchv xut ra mn hnh bng cc lnh nh sau:
Console.WriteLine(time:{0},theMatch.Groups[time]);
Kt qu l :
Time:10:20:30
Ta nhn c kt qu:
IP:127.0.0.0 Site:Dolphin.net
Trong v d 10.8 trn th tp hp Matchch so khp duy nht mt ln. Tuy nhin, n c th so khp nhiu hn na trong mt chui. lm c iu ny, chng ta c th b sung chui tm kim c ly t trong mt log file nh sau:
Stringstring1=10:20:30127.0.0.0Dolphin.net+10:20:31 127.0.0.0Mun.net+10:20:32127.0.0.0 Msn.net;
Trong v d ny phn b sung, th theMatchescha ba i tng Match. Mi ln lp th cc chui con c tm thy (ba ln) v chng ta c th xut ra chui cng nh tng nhm ring bn trong ca chui con c tm thy.
S dng lp CaptureCollection
Mi khi mt i tng Regextm thy mt chui con, th mt th hin Capturec to ra v c thm vo trong mt tp hp CaptureCollection. Mi mt i tng Capture th
hin mt chui con ring. Mi nhm c mt tp hp cc Capture c tm thy trong chui con c lin h vi nhm.
Thuc tnh quan trng ca i tng Capture l thuc tnh Length, y chnh l chiu di ca chui con c nm gi. Khi chng ta hi Match chiu di ca n, th chng ta s nhn c Capture.Length do Match c dn xut t Group v n lt Group li c dn xut t Capture. M hnh k tha trong biu thc quy tc ca .NET cho php Match tha hng nhng giao din phng thc v thuc tnh ca nhng lp cha ca n. Theo ngha ny, th mt
Group l
tng v cc nhm biu thc. n lut Match, n cng l mt Group (Match is-a Group), n ng gi tt c cc nhm biu thc con c so khp trong biu thc quy tc (Xem chi tit hn trong chng 5: K tha v a hnh). Thng thng, chng ta s tm thy ch mt Capturetrong tp hp CaptureCollection; nhng iu ny khng phi vy. Chng ta th tm hiu vn nh sau, y chng ta s gp trng hp l phn tch mt chui trong c nhm tn ca cng ty c xut hin hai ln. nhm chng li trong chui tm thy chng ta to nhm ?<company> xut hin hai ni trong mu biu thc quy tc nh sau:
RegextheReg=newRegex(@(?<time>(\d|\:)+)\s+ @(?<company>\S+)\s+ @(?<ip>(\d|\.)+)\s+ @(?<company>\S+)\s);
Biu thc quy tc ny nhm bt c chui no hp vi mu so khp time, v cng nh bt c chui no theo nhm ip. Gi s chng ta dng chui sau lm chui tm kim:
stringstring1=10:20:30IBM127.0.0.0HP;
Chui ny cha tn ca hai cng ty hai v tr khc nhau, v kt qu thc hin chng trnh l nh sau:
theMatch:10:20:30IBM127.0.0.0HPTime: 10:20:30 IP:127.0.0.0 Company:HP
iu g xy ra? Ti sao nhm Companych th hin gi tr HP. Cn chui u tin u hay l khng c tm thy? Cu tr li chnh xc l mc th hai vit chng mc u. Tuy nhin, Groupvn lu gi c hai gi tr. V ta dng tp hp Capture ly cc gi tr ny. V d minh ha 10.9: Tm hiu tp hp CaptureCollection. ----------------------------------------------------------------------------namespaceProgramming_CSharp
{ publicstaticvoidMain() { //tomtchuiphntch //lultncngtycxut //hinchaini stringstring1=10:20:30IBM127.0.0.0HP; //biuthcquytcvivicnhmhailntncngty RegextheReg=newRegex(@(?<time>(\d|\:)+)\s+ @(?<company>\S+)\s+ @(?<ip>(\d|\.)+)\s+ @(?<company>\S+)\s); //avotphpccchuictmthy MatchCollectiontheMatches=theReg.Matches(string1); //dngvnglplyktqu foreach(MatchtheMatchintheMatches) { if(theMatch.Length!=0) { Console.WriteLine(theMatch:{0},theMatch.ToString()); Console.WriteLine(Tme:{0},theMatch.Groups[time]); Console.WriteLine(IP{0},theMatch.Groups[ip]); Console.WriteLine(Company:{0},theMatch.Groups[company]); //lpquatphpCapturelynhmcompany foreach(CapturecapintheMatch.Groups[Company].Captures) { Console.WriteLine(Capture:{0},cap.ToString()); }//endforeach }//endif }//endforeach }//endMain }//endclass }//endnamespace t h e M
K t q u :
-----------------------------------------------------------------------------
on lp ny lp qua tp hp Capture ca nhm Company. Chng ta th tm hiu cch phn tch nh sau. Trnh bin dch bt u tm mt tp hp ci m chng s thc hin vic lp. theMatch l mt i tng c mt tp hp tn l Groups. Tp hp Groups c mt ch mc a ra mt chui v tr v mt i tng Group. Do vy, dng lnh sau tr v mt i tng n Group:
theMatch.Groups[company];
theMatch.Groups[company].Captures
Vng lp foreach lp qua tp hp Captures, v ly tng thnh phn ra v gn cho bin cc b cap, bin ny c kiu l Capture. Chng ta c th xem t kt qu l c hai thnh phn c lu gi l : IBMv HP. Chui th hai vit chng ln chui th nht trong nhm, do vy ch hin th gi tr th hai l HP. Tuy nhin, bng vic s dng tp hp Captureschng ta c th thu c c hai gi tr c lu gi.
Cu hi v tr li
Cuhi 1: Nhng tm tt c bn v chui? Tr li 1: Chui l kiu d liu thng c s dng nht trong lp trnh. Trong ngn ng C#, chui c h tr rt mnh thng qua cc lp v chui v biu thc quy tc. Chui l kiu d liu tham chiu, cha cc k t Unicode. Cc thao tc trn i tng chui khng lm thay i gi tr ca chui m ta ch nhn c kt qu tr v. Tuy nhin, C# cung cp lp StringBuildercho php thao tc trc tip b sung chui. Cuhi 2: Biu thc quy tc l g? Tr li 2: Biu thc quy tc l ngn ng dng m t v thao tc vn bn. Mt biu thc quy tc thng c p dng cho mt chui vn bn hay ton b ti liu no . Kt qu ca vic p dng mt biu thc quy tc l ta nhn c mt chui kt qu, chui ny c th l chui con ca chui p dng hay c th l mt chui mi c b sung t chui ban u.
Cuhi 3: Thao tc thng xuyn thc hin trn mt chui l thao tc no?
Tr li 3: Nh n bn trn, thao tc thng xuyn thc hin trn mt chui l tm kim chui con tha quy tc no . Mt ngn ng nu mnh v thao tc trn chui, chc chn phi cung cp nhiu phng thc thao tc tt tm kim cc chui con theo quy tc. Ngn ng C# cng rt mnh v im ny, do chng tha hng t cc lp thao tc trn chui ca . NET.
Cu hi thm
Cuhi 1: C bao nhiu cch to chui trong ngn ng C#? Cu hi 2: Chui Verbatim l chui nh th no? Hy cho mt vi v d minh ha v chui ny v din gii ngha ca chng? Cuhi 3: S khc nhau c bn gia mt chui to t i tng string v StringBuilder? Cuhi 4: Khi no th nn dng chui to t lp string v StringBuilder? Cuhi 5: Mt biu thc quy tc c bao nhiu kiu k t? Cuhi 6: Mt biu thc quy tc sau y so khp iu g? ^(Name|Address|Phone|Fax):
Bi tp
Bi tp 1: Vit chng trnh cho php ngi dng nhp vo mt chui. Sau m s k t xut hin ca tng k t trong chui nh v d sau: a : 2 g : 5 2 : 1 .... Bi tp 2: Vit chng trnh tm mt chui con trong mt chui cho trc. Chng trnh cho php ngi dng nhp vo mt chui, v chui con cn tm. Kt qu l chui con c tm thy hay khng, nu tm thy th hy a ra v tr u tin tm thy. Bi tp 3: Vit chng trnh tm s ln xut hin mt chui con trong mt chui cho trc. Chng trnh cho php ngi dng nhp vo mt chui v chui con cn m. Kt qu hin th chui, chui con v cc v tr m chui con xut hin trong chui. Bi tp4: Vit chng trnh cho php ngi dng nhp vo mt chui, ri thc hin vic o cc k t trong chui theo th t ngc li. Bi tp5: Vit chng trnh ct cc t c ngha trong cu. V d nh cho t: Thuc hanh lap trinh th ct thnh 4 ch: Thuc, hanh, lap, trinh. Bi tp 6: Hy vit chng trnh s dng biu thc quy tc ly ra chui ngy/thng/nm trong mt chui cho trc? Cho php ngi dng nhp vo mt chui ri dng biu thc quy tc va to ra thc hin vic tm kim.
Bi tp 7: Hy vit chng trnh s dng biu thc quy tc ly ra thi gian gi:pht:giy trong mt chui cho trc? Chng trnh cho php ngi dng nhp vo mt chui ri dng biu thc quy tc va to thc hin vic tm kim.
Chng 11
C CH Y QUYN - S KIN
y quyn
S dng y quyn xc nhn phng thc lc thc thi
y quyn tnh
Dng y quyn nh thuc tnh Thit lp th t thi hnh vi mng y quyn Muticasting
S kin
Cu hi & bi tp
Trong lp trnh chng ta thng i din vi tnh hung l khi chng ta mun thc hin mt hnh ng no , nhng hin ti th cha xc nh c chnh xc phng thc hay s kin trong i tng. V d nh mt nt lnh button bit rng n phi thng bo cho vi i tng khi n c nhn, nhng n khng bit i tng hay nhiu i tng no cn c thng bo. Tt hn vic ni nt lnh vi i tng c th, chng ta c th kt ni nt lnh n mt c ch y quyn v sau th chng ta thc hin vic y quyn n phng thc c th khi thc thi chng trnh. Trong thi k u ca my tnh, chng trnh c thc hin theo trnh t x l tng bc tun t cho n khi hon thnh, v nu ngi dng thc hin mt s tng tc th s lm hn ch s iu khin hot ng khc ca chng trnh cho n khi s tng tc vi ngi dng chm dt. Tuy nhin, ngy nay vi m hnh lp trnh giao din ngi dng ha (GUI: Graphical User Interface) i hi mt cch tip cn khc, v c bit nh l lp trnh iu khin s kin (event-driven programming). Chng trnh hin i ny a ra mt giao din tng tc vi ngi dng v sau th ch cho ngi s dng kch hot mt hnh ng no . 576 Ngi
C Ch y Quyn - S Kin
s dng c th thc hin nhiu hnh ng khc nhau nh: chn cc mc chn trong menu, nhn mt nt lnh, cp nht cc cha vn bn,...Mi hnh ng nh vy s dn n mt s
577
C Ch y Quyn - S Kin
kin (event) c sinh ra. Mt s cc s kin khc cng c th c xut hin m khng cn hnh ng trc tip ca ngi dng. Cc s kin ny xut hin do cc thit b nh ng h ca my tnh pht ra theo chu k thi gian, th in t c nhn, hay n gin l bo mt hnh ng sao chp tp tin hon thnh,... Mt s kin c ng gi nh mt tng chuyn g xy ra v chng trnh phi p ng li vi s kin . C ch s kin v y quyn gn lin vi nhau, bi v khi mt s kin xut hin th cn phi phn pht s kin n trnh x l s kin tng ng. Thng trng mt trnh x l s kin c thc thi trong C# nh l mt s y quyn. y quyn cho php mt lp c th yu cu mt lp khc lm mt cng vic no , v khi thc hin cng vic th phi bo cho lp bit. y quyn cng co th c s dng xc nhn nhng phng thc ch c bit lc thc thi chng trnh, v chng ta s tm hiu k vn ny trong phn chnh ca chng.
y quyn (delegate)
Trong ngn ng C#, y quyn l lp i tng u tin (first-class object), c h tr y bi ngn ng lp trnh. Theo k thut th y quyn l kiu d liu tham chiu c dng ng gi mt phng thc vi tham s v kiu tr v xc nh. Chng ta c th ng gi bt c phng thc thch hp no vo trong mt i tng y quyn. Trong ngn ng C++ v nhng ngn ng khc, chng ta c th lm c iu ny bng cch s dng con tr hm (function pointer) v con tr n hm thnh vin. Khng ging nh con tr hm nh trong C/C++, y quyn l hng i tng, kiu d liu an ton (type-safe) v bo mt. Mt iu th v v hu dng ca y quyn l n khng cn bit v cng khng quan tm n nhng lp i tng m n tham chiu ti. iu cn quan tm n nhng i tng l cc i mc ca phng thc v kiu tr v phi ph hp vi i tng y quyn khai bo. to mt y quyn ta dng t kha delegate theo sau l kiu tr v tn phng thc c y quyn v cc i mc cn thit:
publicdelegateintWhichIsFirst(objectobj1,objectobj2);
Khai bo trn nh ngha mt y quyn tn l WhichIsFirst, n s ng gi bt c phng thc no ly hai tham s kiu objectv tr v gi tr int. Mt khi m y quyn c nh ngha, chng ta c th ng gi mt phng thc thnh vin bng vic to mt th hin ca y quyn ny, truyn vo trong mt phng thc c khai bo kiu tr v v cc i mc cn thit. 578
C Ch y Quyn - S Kin
Lu : T phn ny v sau chng ta quy c c th s dng qua li gia hai t u quyn v delegate vi nhau.
579
C Ch y Quyn - S Kin
cng c th c s dng xc nh cc phng thc tnh v cc instance ca phng thc m chng ta khng bit trc cho n khi chng trnh thc hin. Gi s minh ha nh sau, chng ta mun to mt lp cha n gin gi l Pair lp ny lu gi v sp xp hai i tng c truyn vo cho chng. Tm thi lc ny chng ta cng khng th bit loi i tng m mt Pair lu gi. Nhng bng cch to ra cc phng thc bn trong cc i tng ny thc hin vic sp xp v c y quyn, chng ta c th y quyn thc hin vic sp th t cho chnh bn thn ca i tng . Nhng i tng khc nhau th s sp xp khc nhau. V d, mt Paircha cc i tng m c th c sp xp theo th t s, trong khi mt Pair nt lnh button c th c sp theo th t alphabe tn ca chng. Mong mun ca ngi to ra lp Pair l nhng i tng bn trong ca Pairphi c trch nhim cho bit th t ca chng ci no l th t u tin v th hai. lm c iu ny, chng ta phi m bo rng cc i tng bn trong
Pairphi
Chng ta nh ngha phng thc yu cu bng vic to mt y quyn, y quyn ny nh ngha k php v kiu tr v ca phng thc i tng (nh button) cung cp v cho php Pairxc nh i tng no n trc u tin v i tng no l th hai. Lp Pairnh ngha mt y quyn, WhichIsFirst. Phng thc Sorts ly mt tham s l th hin ca WhichIsFirst. Khi mt i tng Pair cn bit th t ca nhng i tng bn trong ca n th n s yu cu y quyn truyn vo hai i tng cha trong n nh l tham s. Trch nhim ca vic xc nh th t ca hai i tng c trao cho phng thc ng gi bi y quyn. kim tra thc hin c ch y quyn, chng ta s to ra hai lp, lp
Catv
phng thc c ng gi bi WhichIsFirst. Do vy c hai i tng ny c th c lu gi bn trong ca i tng Pair. Trong chng trnh th nghim ny chng ta s to ra hai i tng Student v hai i tng Catv lu chng vo mi mt i tng Pair. Sau chng ta s to nhng i tng y quyn ng gi nhng phng thc ca chng, nhng phng thc ny phi ph hp vi k php v kiu tr v ca y quyn. Sau cng chng ta s yu cu nhng i tng
Pair
ny sp xp nhng i tng Studentv Cat, ta lm tng bc nh sau: Bt u bng vic to phng thc khi dng Pair ly hai i tng v a chng vo trong tng mng ring:
Tip theo l chng ta ph quyt phng thc ToString() cha gi tr mi ca hai i tng m Pairnm gi:
publicoverridestringToString() { //xutthtitngthnhttrcitngthhaireturn thePair[0].ToString()+,+thePair[1].ToString(); }
By gi th chng ta c hai i tng bn trong ca Pairv chng ta c th xut gi tr ca chng ra mn hnh. Tip tc l chng ta s thc hin vic sp xp v in kt qu sp xp. Hin ti th khng xc nh c loi i tng m chng ta c, do chng ta s y quyn quyt nh th t sp xp cho chnh bn thn cc i tng m Pair lu gi bn trong. Do vy, chng ta yu cu rng mi i tng c lu gi bn trong Pairthc hin vic kim tra xem i tng no sp trc. Phng thc ny ly hai tham s i tng v tr v gi tr kiu lit k: theFirstComeFirst nu i tng u tin c n trc v theSecondComeFirst nu gi tr th hai n trc. Nhng phng thc yu cu s c ng gi bi y quyn WhichIsFirstc nh ngha bn trong lp Pair:
publicdelegatecomparison WhichIsFirst(objectobj1,objectobj2);
Bt c phng thc tnh no ly hai tham s i tng objectv tr v kiu comparison c th c ng gi bi y quyn vo lc thc thi. Lc ny chng ta nh ngha phng thc Sortcho lp Pair:
publicvoidSort(WhichIsFirsttheDelegateFunc) {
if(theDelegateFunc(thePair[0],thePair[1])== comparison.theSecondComeFirst) {
ca hai i tng bn trong Pair n phng thc c ng gi bi y quyn. Bn trong thn ca Sort, phng thc y quyn c gi v tr v mt gi tr, gi tr ny l mt trong hai gi tr lit k ca comparison. Nu gi tr tr v l theSecondComesFirst, i tng bn trong ca Pairs c hon i v tr, trng hp ngc li th khng lm g c. Hy tng tng chng ta ang sp xp nhng Studenttheo tn. Chng ta vit mt phng thc tr v theFirstComesFirst nu tn ca sinh vin u tin n trc v theSecondComesFirst nu tn ca sinh vin th hai n trc. Nu chng ta a vo l Amy, Beth th phng thc tr v kt qu l theFirstComesFirst. V ngc li nu chng ta truyn Beth, Amy th kt qu tr v l theSecondComesFirst. Khi chng ta nhn c kt qu theSecondComesFirst, phng thc Sort s o hai i tng ny trong mng, v thit lp l Amy v tr u cn Beth v tr th hai. Tip theo chng ta s thm mt phng thc ReverseSort, phng thc ny t cc mc trong mng theo th t o ngc li:
publicvoidReverseSort(WhichIsFirsttheDeleagteFunc) { if(theDelegateFunc(thePair[0],thePair[1])== comparison.theFirstComesFirst) { objecttemp=thePair[0]; thePair[0]=thePair[1]; thePair[1]=temp; } }
Vic thc hin cng tng t nh phng thc Sort. Tuy nhin, phng thc thc hin vic hon i nu phng thc y quyn xc nh l i tng trc ti trc. Do vy, kt qu thc hin ca phng thc l i tng th hai s n trc. Lc ny nu chng ta truyn vo
theFirstComesFirst,
Amy, Beth,
phng
thc
y quyn s
tr
thit lp Beth n trc. iu ny cho php chng ta s dng cng phng thc y quyn tng t nh Sort, m khng cn yu cu i tng h tr phng thc tr v gi tr c sp ngc.
Lc ny iu cn thit l chng ta to ra vi i tng sp xp. Ta to hai lp i tng n gin nh sau: lp i tng Student v lp i tng Cat. Gn cho i tng Studentmt tn vo lc to:
publicclassStudent { publicStudent(stringname) { this.name=name; } }
v mt phng thc khc c ng gi nh l phng thc y quyn. dng mt cch chnh xc. Vic thc thi ny th khng c g phc tp m ch n thun
l tr v tn ca sinh vin:
publicoverridestringToString() { returnname; } Studentcng
hai chui v tr v mt gi tr nh hn 0 nu chui u tin nh hn chui th hai v ln hn 0 nu chui th hai nh hn, v gi tr l 0 nu hai chui bng nhau. Phng thc ny cng c trnh by trong chng 10 v chui. Theo l lun trn th gi tr tr v l theFirstComesFirst ch khi chui th nht nh hn, nu hai chui bng nhau hay chui th hai ln hn, th phng thc ny s tr v cng gi tr l theSecondComesFirst.
Ghi ch rng phng thc WhichStudentComesFirstly hai tham s kiu i tng v tr v gi tr kiu lit k comparison. iu ny lm tng ng v ph hp vi phng thc c y quyn Pair.WhichIsFirst.
Lp th hai l Cat, phc v cho mc ch ca chng ta, th Cats c sp xp theo trng lng, nh n trc nng. Ta c khai bo lp Catnh sau:
publicclassCat { publicCat(intweight) { this.weight=weight; } //sptheotrnglng publicstaticcomparisonWhichCatComesFirst(Objecto1,Objecto2) { Catc1=(Cat)o1;Cat c2=(Cat)o2; returnc1.weight>c2.weight? theSecondComesFirst: theFirstComesFirst; } publicoverridestringToString() { returnweight.ToString(); } //binlugitrnglng privateintweight; }
Cng tng t nh lp Studentth lp Cat cng ph quyt phng thc ToString()v thc thi mt phng thc tnh vi c php tng ng vi phng thc y quyn. V chng ta cng lu l phng thc y quyn ca Student v Cat l khng cng tn vi nhau. Chng ta khng cn thit phi lm cng tn v chng ta s gn n phng thc y quyn lc thc thi. V d minh ha 11.1 sau trnh by cch mt phng thc y quyn c gi. V d 11.1: Lm vic vi y quyn. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem;
theSecondComesFirst=2 } //lpPairnginlugi2itngpublic classPair { //khaiboyquyn publicdelegatecomparisonWhichIsFirst(objectobj1,objectobj2); //truynhaiitngvobkhidng publicPair(objectfirstObject,objectsecondObject) { thePair[0]=firstObject; thePair[1]=secondObject; } //phngthcspxpthtcahaiitng //theobtctiuchunnocaitngpublicvoid Sort(WhichIsFirsttheDelegateFunc) { if(theDelegateFunc(thePair[0],thePair[1])== comparison.theSecondComesFirst) { objecttemp=thePair[0]; thePair[0]=thePair[1]; thePair[1]=temp; } } //phngthcspxphaiitngtheo //thtnghcholitiuchunspxp publicvoidReverseSort(WhichIsFirsttheDelegateFunc) { if(theDelegateFunc(thePair[0],thePair[1])== comparison.theFirstComesFirst) { objecttemp=thePair[0]; thePair[0]=thePair[1];
thePair[1]=temp; } } //yucuhaiitngaragitrcan
publicoverridestringToString() { returnthePair[0].ToString()+,+thePair[1].ToString(); } //mnglu2itng privateobject[]thePair=newobject[2]; } //lpitngCat publicclassCat { publicCat(intweight) { this.weight=weight; } //sptheothttrnglng publicstaticcomparisonWhichCatComesFirst(Objecto1,Objecto2) { Catc1=(Cat)o1;Cat c2=(Cat)o2; returnc1.weight>c2.weight? comparison.theSecondComesFirst: comparison.theFirstComesFirst; } publicoverridestringToString() { returnweight.ToString(); } //binlutrnglng privateintweight; } //khaibolpStudent publicclassStudent { publicStudent(stringname) {
this.name=name; } //sptheothtchci
publicstaticcomparisonWhichStudentComesFirst(Objecto1,Objecto2) { Students1=(Student)o1; Students2=(Student)o2; return(String.Compare(s1.name,s2.name)<0? comparison.theFirstComesFirst: comparison.theSecondComesFirst); } publicoverridestringToString() { returnname; } //binlutnprivate stringname; } publicclassTest { publicstaticvoidMain() { //torahaiitngStudentvCat //achngvohaiitngPairStudent Thao=newStudent(Thao);Student Ba=newStudent(Ba); CatMun=newCat(5);Cat Ngao=newCat(2); PairstudentPair=newPair(Thao,Ba);Pair catPair=newPair(Mun,Ngao); Console.WriteLine(Sinhvien\t\t\t:{0},studentPair.ToString()); Console.WriteLine(Meo\t\t\t:{0},catPair.ToString()); //toyquyn Pair.WhichIsFirsttheStudentDelegate=new Pair.WhichIsFirst(Student.WhichStudentComesFirst); Pair.WhichIsFirsttheCatDelegate=new Pair.WhichIsFirst(Cat.WhichCatComesFirst); //spxp dngyquyn studentPair.So rt(theStudentD elegate); Console.WriteL ine(Sa ukhi sap xep studen tPair\t\t :{0}, studen
tPair.ToString());
----------------------------------------------------------------------------Kt qu:
Sinh vien Meo : Thao, Ba : 5, 2 : Ba, Thao : Thao, Ba : 5, 2 : 2, 5
Sau khi sap xep studentPair Sau khi sap xep nguoc studentPair Sau khi sap xep catPair Sau khi sap xep nguoc catPair
----------------------------------------------------------------------------Trong on chng trnh th nghim trn chng ta to ra hai i tng Student v hai i tng Cat sau a chng vo hai i tng cha Pair theo tng loi. B khi dng ca lp Studently mt chui i din cho tn ca sinh vin v b khi dng ca lp Cat th ly mt s inti din cho trng lng ca mo.
StudentThao=newStudent(Thao); Student Ba=newStudent(Ba);
Sau chng trnh in ni dung cha bn trong ca hai i tng cha Pair, v chng ta c
th thy th t nh sau:
Sinhvien Meo :Thao,Ba :5,2
Th t xut hin ca n chnh l th t a vo. Tip theo chng ta khi to hai i tng y quyn:
Pair.WhichIsFirsttheStudentDelegate=new Pair.WhichIsFirst(Student.WhichStudentComesFirst); Pair.WhichIsFirsttheCatDelegate=new Pair.WhichIsFirst(Student.WhichCatComesFirst);
y quyn u tin theStudentDelegate c to ra bng cch truyn vo mt phng thc tnh tng ng ca lp Student. i tng y quyn th hai, theCatDelegate c mt phng thc tnh ca lp Cat. By gi ta c cc i tng y quyn, chng ta truyn y quyn u tin cho phng thc Sort ca i tng Pair, v sau l phng thc ReverseSort. Kt qu c xut ra mn hnh:
SaukhisapxepstudentPair :Ba,Thao SaukhisapxepnguocstudentPair:Thao,Ba SaukhisapxepcatPair SaukhisapxepnguoccatPair :2,5 :5,2
y quyn tnh
Nh chng ta thy trong v d minh ho 11.1 trc th hai th hin phng thc y quyn c khai bo bn trong lp gi (chnh xc l trong hm Mainca Test). iu ny c th khng cn thit ta c th s dng khai bo y quyn tnh t hai lp Studentv Cat. Do vy ta c th b sung lp Studentbng cch thm vo:
publicstaticreadonlyPair.WhichIsFirstOrderStudents= newPair.WhichIsFirst(Student.WhichStudentComesFirst);
th khng c b sung sau . Tng t nh vy chng ta c th to y quyn tnh cho Catnh sau:
publicstaticreadonlyPair.WhichIsFirstOderCats= newPair.WhichIsFirst(Cat.WhichCatComesFirst);
By gi th c hai trng tnh hin din bn trong cc lp Studentv Cat, mi ci s gn vi phng thc tng ng bn trong lp. Sau chng ta c th thc hin y quyn m khng cn khai bo th hin y quyn cc b. Vic chuyn y quyn c thc hin trong lnh in m nh sau:
studentPair.Sort(theStudentDelegate);
iu quan trng y l y quyn s khng c to cho n khi no n c yu cu. Vic ny cho php lp gi (nh lp Test) quyt nh khi no cn thit s dng mt y quyn nhng vn cho php vic to y quyn l trch nhim ca lp Studenthay lp Cat.
Chng ta c th tng tng rng vic xut ra chui nh vy tng ng vi vic to mt nh .gif hay .jpeg hay i loi nh vy. Sau lp ImageProcessorkhai bo mt y quyn. D nhin l chng ta c th nh ngha mt y quyn ring tr v bt c kiu d liu no hay ly bt c tham s no m chng ta mun. Trong v d ny chng ta nh ngha mt y quyn c th ng gi bt c phng thc khng c gi tr tr v v cng khng nhn bt c tham s no ht:
publicdelegatevoidDoEffect();
Tip tc lp ImageProcessor khai bo mt s phng thc, v tng phng thc ny ph hp vi k php v kiu tr v c khai bo bi y quyn:
publicstaticvoidBlur()
{ Console.WriteLine(Blurringimage); }
Lp ImageProcessorcn thit c mt mng lu gi cc y quyn m ngi s dng chn, mt bin lu gi s hiu ng c chn v d nhin l c mt bin nh x l:
DoEffect[]arrayOfEffects; Imageimage; intnumEffectsRegistered=0; ImageProcessorcng { if(numEffectsRegistered>=0) { thrownewException(Toomanymembersinarray); } arrayOfEffects[numEffectsRegistered++]=theEffect; }
publicvoidAddToEffects(DoEffecttheEffect)
Cui cng, chng ta khai bo nhng y quyn tnh, cc client gi, v chn chng li x
publicDoEffectFilterEffect=newDoEffect(Filter); publicDoEffectRotateEffect=newDoEffect(Rotate);
Vic chn cc thao tc din ra trong qu trnh tng tc thnh phn giao din ngi s dng. Trong v d ny chng ta m phng bng cch chn cc hiu ng, thm chng vo trong mng, v ProcessImage. V d minh ha 11.2: S dng mng y quyn. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; //khaibolpnh publicclassImage { publicImage() { Console.WriteLine(Animagecreated); } } //lpxlnh publicclassImageProcessor { //khaiboyquyn publicdelegatevoidDoEffect(); //toccyquyntnh publicDoEffectBlurEffect=newDoEffect(Blur); publicDoEffectSharpenEffect=newDoEffect(Sharpen); publicDoEffectFilterEffect=newDoEffect(Filter); publicDoEffectRotateEffect=newDoEffect(Rotate); //bkhidngkhitonhvmngpublic ImageProcessor(Imageimage) { this.image=image; arrayOfEffects=newDoEffect[10]; }
{ thrownewException(Toomanymembersinarray); } arrayOfEffects[numEffectsRegistered++]=theEffect; } //ccphngthcxlnh publicstaticvoidBlur() { Console.WriteLine(Blurringimage); } publicstaticvoidFilter() { Console.WriteLine(Filteringimage); } publicstaticvoidSharpen() { Console.WriteLine(Sharpeningimage); } publicstaticvoidRotate() { Console.WriteLine(Rotatingimage); } //giccyquynthchinhiungpublic voidProcessImage() { for(inti=0;i<numEffectsRegistered;i++) { arrayOfEffects[i](); } } //binthnhvin privateDoEffect[]arrayOfEffects; privateImageimage; privateintnumEffectsRegistered=0; } //
lpTestkimchngchngtrnhpublic classTest {
publicstaticvoidMain() { ImagetheImage=newImage(); //dokhngcGUIthchinchngtaschnln //ltcchnhngvthchin ImageProcessortheProc=newImageProcessor(theImage); theProc.AddToEffects(theProc.BlurEffect); theProc.AddToEffects(theProc.FilterEffect); theProc.AddToEffects(theProc.RotateEffect); theProc.AddToEffects(theProc.SharpenEffect); theProc.ProcessImage(); } } }
----------------------------------------------------------------------------Kt qu:
An image created Blurring image Filtering image Rotate image Sharpening image
----------------------------------------------------------------------------Trong v d trn, i tng ImageProcessor c to ra v nhng hiu ng c thm vo. Nu ngi dng chn lm m trc khi lc nh, th n gin l c a vo mng y quyn theo th t tng ng. Tng t nh vy, bt c hnh ng la chn no ca ngi dng mong mun, ta a thm nhiu y quyn vo trong tp hp. Chng ta c th tng tng vic hin th th t hnh ng ny trong mt danh sch listbox v cho php ngi s dng sp xp li phng thc, di chuyn chng ln xung trong danh sch. Khi cc hnh ng ny c sp xp li th chng ta ch cn thay i th t trong tp hp. Ngoi ra ta cng c th a cc hot ng ny vo trong c s d liu ri sau c chng lc thc hin. y quyn d dng cung cp ng cho ta cc phng thc c gi theo mt th t xc nh
Multicasting
C ch multicasting cho php gi hai phng thc thc thi thng qua mt y quyn n. iu ny tr nn quan trng khi x l cc s kin, s c tho lun trong phn
cui ca chng.
Mc ch chnh l c mt y quyn c th gi thc hin nhiu hn mt phng thc. iu ny hon ton khc vi vic c mt tp hp cc y quyn, v mi trong s chng ch gi c duy nht mt phng thc. Trong v d trc, tp hp c s dng lu gi cc y quyn khc nhau. Tp hp ny cng c th thm mt y quyn nhiu hn mt ln, v s dng tp hp sp xp li cc y quyn v iu khin th t hnh ng c gi. Vi Multicasting chng ta c th to mt y quyn n v cho php gi nhiu phng thc c ng. V d, khi mt nt lnh c nhn chng ta c th mun thc hin nhiu hn mt hh ng. lm c iu ny chng ta c th a cho button mt tp hp cc y quyn, nhng sng r hn v d dng hn l to mt y quyn Multicast. Bt c y quyn no tr v gi tr voidl y quyn multicast, mc d vy ta c th i x vi n nh l y quyn bnh thng cng khng sao. Hai y quyn Multicast c th c kt hp vi nhau bng php ton cng (+). Kt qu l mt y quyn Multicast mi v gi n tt c cc phng thc thc thi nguyn thy ca c hai bn. V d, gi s Writer v
Logger l
Chng ta cng c th thm nhng y quyn vo trong y quyn Multicast bng ton t cng bng (+=). Php ton ny s thm y quyn pha bn phi ca ton t vo y quyn Multicast bn tri. V d minh ha nh sau, gi s c Transmitter v
myMulticastDelegate
l nhng y quyn, lnh tip theo sau y s thc hin vic thm y quyn Transmittervo trong myMulticastDelegate:
myMulticastDelegate+=Transmitter;
hiu r y quyn Multicast c to ra v s dng, chng ta s tng bc tm hiu thng qua v d 11.3 bn di, trong v d minh ha ny chng ta s to ra mt lp c tn gi l MyClassWithDelegate lp ny nh ngha mt delegate, delegate ny ly mt tham s l chui v khng c gi tr tr v:
voiddelegatevoidStringDelegate(strings);
Sau chng ta nh mt lp gi l MyImplementingClasslp ny c ba phng thc, tt c cc phng thc ny u tr v gi tr void v nhn mt chui lm tham s:
WriteString, LogString,
hnh tiu chun, chui th hai m phng vit vo mt log file, v phng thc th ba m phng vic chuyn mt chui qua Internet. Chng ta to th hin delegate gi nhng phng thc tng ng:
Tip theo chng ta thm vo delegate ny mt delegate na bng cch s dng ton t (+=):
myMulticastDelegate+=Transmitter;
Cui cng, chng ta thc hin vic xa deleagate bng s dng ton t (-=):
DelegateCollector=Logger;
Sau y l ton b v d minh ha. V d 11.3: Kt hp cc delegate. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassMyClassWithDelegate { //khaibodelegate publicdelegatevoidStringDelegate(strings); } publicclassMyImplementingClass { publicstaticvoidWriteString(strings) { Console.WriteLine(Writingstring{0},s); } publicstaticvoidLogString(strings) { Console.WriteLine(Loggingstring{0},s); } publicstaticvoidTransmitString(strings) { Console.WriteLine(Transmittingstring{0},s); } } publicclassTest { publicstaticvoidMain() {
//nhngha3StringDelegate MyClassWithDelegate.StringDelegateWriter,Logger,Transmitter;
//tothhinca3delegateutinvtruynvophngthcthcthi Writer=newMyClassWithDelegate.StringDelegate( MyImplementingClass.WriteString); Logger=newMyClassWithDelegate.StringDelegate( MyImplementingClass.LogString); Transmitter=newMyClassWithDelegate.StringDelegate( MyImplementingClass.TransmitString); //giphngthcdelegateWriter Writer(StringpassedtoWriter\n); //giphngthcdelegateLogger Logger(StringpassedtoLogger\n); //giphngthcdelegateTransmitter Transmitter(StringpassedtoTransmitter\n); //thngbongidngrngkthphaidelegatevo //trongmtmulticastdelegate Console.WriteLine(myMulticastDelegate=Writer+Logger); //kthphaidelegatemyMulticastDelegate= Writer+Logger; //giphngthcdelegate,haiphngthcscthchin myMulticastDelegate(FirststringpassedtoCollector); //bovingisdngrngthmdelegateth3vo //trongMulticastdelegate Console.WriteLine(\nmyMulticastDeleagte+=Transmitter); //thmdelegatethbavo myMulticastDelegate+=Transmitter; //githcthiMulticastdelegate,cngmtlcba //phngthcscngcgithchin myMulticastDelegate(SecondstringpassedtoCollector); //bovingisdngrngxadelegateLogger Console.WriteLine(\nmyMulticastDelegate=Logger); //xadelegateLogger
}//endnamespace
----------------------------------------------------------------------------Kt qu:
Writing string String passed to Writer Logging string String passed to Logger Transmitting string String passed to Transmitter myMulticastDelegate = Writer + Logger Writing string First string passed to Collector Logging string First string passed to Collector myMulticastDelegate += Transmitter Writing string Second string passed to Collector Logging string Second string passed to Collector Transmitting string Second string passed to Collector myMulticastDelegate -= Logger Writing string Third string passed to Collector Transmitting string Third string passed to Collector
bng cch kt hp hai delegate u, v khi n c gi, th dn n l c hai delegate cng c gi. Khi delegate th ba c thm vo, v kt qu l khi myMulticastDelegate c gi th tt c ba phng thc delegate cng c thc hin. Cui cng, khi Logger c xa khi delegate, v khi myMulticastDelegatec gi th ch c hai phng thc thc thi. Multicast delegate c th hin tt nht trong vic ng dng x l cc s kin. Khi mt s kin v d nh mt nt lnh c nhn, th mt multicast delegate tng ng s gi n mt lot cc phng thc x l s kin p ng li vi cc s kin ny.
S kin
Trong mi trng giao din ha (Graphical User Interfaces: GUIs), Windows hay trong trnh duyt web i hi cc chng trnh phi p ng cc s kin. Mt s kin c th l mt nt lnh c nhn, mt mc trong menu c chn, hnh ng sao chp tp tin hon thnh,...Hay ni ngn gn l mt hnh ng no xy ra, v ta phi p ng li s kin . Chng ta khng th on trc c khi no th cc s kin s xut hin. H thng s ch cho n khi nhn c s kin, v s chuyn vo cho trnh x l s kin thc hin. Trong mi trng giao din ha, bt c thnh phn no cng c th a ra s kin. V d,
khi chng ta kch vo mt nt lnh, n c th a ra s kin Click. Khi chng ta thm mt mc vo danh sch, n s a ra s kin ListChanged.
C ch publishing v subscribing
Trong ngn ng C#, bt c i tng no cng c th publish mt tp hp cc s kin cho cc lp khc c th ng k. Khi mt lp publish a ra mt s kin, th tt c cc lp ng k s c nhn s cnh bo. Ghi ch: Tc gi Gamma (Addison Wesley, 1995) m t c ch ny nh sau: nh ngha mt n nhiu s ph thuc gia nhng i tng do khi mt i tng thay i trng thi, tt c cc i tng khc ph thuc vo n s c cnh bo v cp nht mt cch t ng. Vi c ch ny, i tng ca chng ta c th ni rng y c nhng th m ti c th thng bo cho bn v nhng lp khc c th ng k p rng Vng, hy bo cho ti bit khi chuyn xy ra. V d, mt nt lnh c th cnh bo cho bt c thnh phn no khi n c nhn. Nt lnh ny c gi l publisher bi v n phn pht s kin Click v nhng lp khc l cc lp subscriber v chng ng k nhn s kin Click ny.
S kin v delegate
Nhng s kin trong C# c thc thi vi nhng delegate. Lp publisher nh ngha mt delegate v nhng lp subscriber phi thc thi. Khi mt s kin xut hin th phng thc ca lp subscriber c gi thng qua delegate. Mt phng thc c dng x l cc s kin th c l trnh x l s kin (event handler). Chng ta c th khai bo trnh x l s kin ny nh chng ta lm vi bt c delegate khc. Theo quy c, nhng trnh x l s kin trong .NET Framework tr v gi tr void v ly hai tham s. Tham s u tin l ngun dn n s kin, y chnh l i tng publisher. V tham s th hai l i tng dn xut t lp EventArgs. Yu cu chng ta phi thc hin trnh x l s kin theo mu nh trn.
EventArgs l
cc phng thc ca n t Object, v thm vo mt trng public static empty th hin mt s kin khng c trng thi (cho php s dng hiu qu nhng s kin khng trng thi). Lp dn xut t EventArgscha nhng thng tin v s kin. S kin l thuc tnh ca lp pht ra s kin. T kha event iu khin cch thuc tnh s kin c truy cp bi cc lp subscriber. T kha event c thit k duy tr cho cch th hin publish/ subscribe. Gi s chng ta mun to mt lp Clockdng nhng s kin cnh bo nhng lp subscriber bt c khi no ng h h thng thay i gi tr trong mt giy. Gi s
V d khai bo nh sau:
OnSecondChange;
Trong v d ny ta khng dng thuc tnh, modifier y l abstract, new, override, hay l mt trong bn access modifier, trong trng hp ny public. Modifier c theo sau bi t kha event. Trng type trong trng hp v d ny l delegate m chng ta mun lin h vi s kin, y l SecondChangeHandler. Tn thnh vin l tn ca s kin, trong trng hp ny l OnSecondChange. Thng thng, tn s kin bt u vi t On. Tm li, trong s khai bo ny OnSecondChange l s kin c thc thi bi delegate c kiu l SecondChangeHandler. Ta c khai bo cho delegate ny nh sau:
publicdelegatevoidSecondChangeHandler(objectclock, TimeInfoEventArgstimeInformation);
Nh ni trc y, theo quy c mt trnh x l s kin phi tr v gi tr voidv phi ly hai tham s: ngun pht ra s kin (trong trng hp ny l clock) v mt i tng dn xut t EventArgs, l TimeInfoEventArgs. Lp TimeInfoEventArgsc nh ngha nh sau:
publicclassTimeInfoEventArgs:EventArgs { publicTimeInfoEventArgs(inthour,intminute,intsecond) { this.hour=hour; this.minute=minute; this.second=second; } publicreadonlyinthour;public readonlyintminute;public readonlyintsecond; }
i tng TimeInfoEventArgss c thng tin v gi pht giy hin thi. N nh ngha mt b khi to, ba phng thc, mt bin nguyn readonly. Ngoi vic thm vo mt s kin v delegate, lp i tng Clockc ba bin thnh vin l :
hour, minute, {
publicvoidRun()
//lythigianhinhnh System.DateTimedt=System.DateTime.Now; //nugiythayicnhbochosubscriberif (dt.Second!=second) { //toTimeInfoEventArgstruyn //chosubscriber TimeInfoEventArgstimeInformation= newTimeInfoEventArgs(dt.Hour,dt.Minute,dt.Second); //nucbtclpnongkthcnhboif( OnSecondChange!=null) { OnSecondChange(this,timeInformation); } } //cpnhttrngthi this.second=dt.Second; this.minute=dt.Minute; this.hour=dt.Hour; } }
Phng thc Run to vng lp v hn kim tra nh k thi gian h thng. Nu thi gian thay i t i tng Clock hin hnh, th n s cnh bo cho tt c cc subscriber v sau cp nht li nhng trng thi ca n. Bc u tin l ngng 10 giy:
Thread.Sleep(10);
y chng ta s dng phng thc tnh ca lp Threadt System.Threadingca .NET. S dng phng thc Sleep() ko di khong cch gia hai ln thc hin vng lp. Sau khi ngng 10 mili giy, phng thc s kim tra thi gian hin hnh:
System.DateTimedt=System.DateTime.Now;
C khong 100 ln kim tra, th mt giy s c gia tng. Phng thc ghi nhn s thay i v cnh bo n nhng subscriber ca n. lm c iu ny, u tin phi to ra mt i tng TimeInfoEventArgs:
if(dt.Second!=second)
V cnh bo cho nhng subscriber bng cch kch hot s kin OnSecondChange: // cnh bo cho cc subscriber
if(OnSecondChange!=null) { OnSecondChange(this,timeInformation); }
Nu mt s kin khng c bt c lp subscriber no ng k th n c lng gi tr l null. Phn kim tra bn trn xc nh gi tr ca s kin c phi l nullhay khng, m bo rng c tn ti lp ng k nhn s kin trc khi gi s kin OnSecondChange. Chng ta lu rng OnSecondChange ly hai tham s: ngun pht ra s kin v i tng dn xut t lp EventArgs. y chng ta c th thy rng tham chiu this ca lp clock c truyn bi v clock l ngun pht ra s kin. Tham s th hai l i tng TimeInfoEventArgsc to ra dng lnh bn trn. Mt s kin c pht ra th s gi bt c phng thc no c ng k vi lp Clock thng qua delegate, chng ta s kim tra iu ny sau. Mt khi m s kin c pht ra, chng ta s cp nht li trng thi ca lp Class:
this.second = dt.Second; this.minute = dt.Minute;
this.hour=dt.Hour;
Sau cng l chng ta xy dng nhng lp c th ng k vo cc s kin ny. Chng ta s to hai lp. Lp u tin l lp DisplayClock. Chc nng chnh ca lp ny khng phi l lu gi thi gian m ch hin th thi gian hin hnh ra mn hnh console. n gin chng ta ch to hai phng thc cho lp ny. Phng thc th nht c tn l Subscribe, phng thc chu trch nhim ng k mt s kin OnSecondChange ca lp Clock. Phng thc th hai c to ra l trnh x l s kin TimeHasChanged:
publicclassDisplayClock { publicvoidSubscrible(ClocktheClock) { theClock.OnSecondChange+= newClock.SecondChangeHandler(TimeHasChanged); } publicvoidTimeHasChanged(objecttheClock,TimeInfoEventArgsti) {
} }
s ng k delegate vi s kin OnSecondChangeca Clock. Lp th hai m chng ta to cng s p ng s kin ny, tn l LogCurrentTime. Thng thng lp ny ghi li s kin vo trong tp tin, nhng vi mc ch minh ha ca chng ta, n s ghi ra mn hnh console:
publicclassLogCurrentTime { publicvoidSubscribe(ClocktheClock) { theClock.OnSecondChange+= newClock.SecondChangeHandler(WriteLogEntry); } //thngthngphngthcnyvitrafile //nhngtrongminhhanychngtachxut //ramnhnhconsolemthi publicvoidWriteLogEntry(objecttheClock,TimeInfoEventArgsti) { Console.WriteLine(Loggingtofile:{0}:{1}:{2}, ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString()); } }
Ghi ch rng nhng s kin c thm vo bng cch s dng ton t +=. iu ny cho php nhng s kin mi c thm vo s kin OnSecondChangeca i tng Clockm khng c ph hy bt c s kin no c ng k. Khi LogCurrentTime ng k mt s kin OnSecondChange, chng ta khng mun vic ng k ny lm mt i s ng k ca lp DisplayClocktrc . Tt c phn cn li cn thc hin l to ra mt lp Clock, to m i tng DisplayClockv bo n ng k s kin. Sau chng ta to ra mt i tng LogCurrentTimev cng ng k s kin tng t. Cui cng th thc thi phng thc Run ca Clock. Tt c phn
{ usingSystem; usingSystem.Threading; //lplugithngtinvskin,trongtrnghp //nynchluginhngthngtincgitrlpclockpublic classTimeInfoEventArgs:EventArgs { publicTimeInfoEventArgs(inthour,intminute,intsecond) { this.hour=hour; this.minute=minute; this.second=second; } publicreadonlyinthour;public readonlyintminute;public readonlyintsecond; } //khaibolpClocklpnysphtraccskinpublic classClock { //khaibodelegatemccsubscriberphithcthi publicdelegatevoidSecondChangeHandler(objectclock, TimeInfoEventArgstimeInformation); //skinmchngtaara publiceventSecondChangeHandlerOnSecondChange; //thitlpnghthchin,sphtramiskintrongmigiypublicvoid Run() { for(;;) { //ngng10giy Thread.Sleep(10); //lythigianhinhnh System.DateTimedt=System.DateTime.Now;
//chosubscriber TimeInfoEventArgstimeInformation= newTimeInfoEventArgs(dt.Hour,dt.Minute,dt.Second); //nucbtclpnongkthcnhboif( OnSecondChange!=null) { OnSecondChange(this,timeInformation); } } //cpnhttrngthi this.second=dt.Second; this.minute=dt.Minute; this.hour=dt.Hour; } } privateinthour; privateintminute; privateintsecond; } //lpDisplayClockngkskincaclock. //thcthixlskinbngcchhinthigianhinhnhpublic classDisplayClock { publicvoidSubscrible(ClocktheClock) { theClock.OnSecondChange+= newClock.SecondChangeHandler(TimeHasChanged); } publicvoidTimeHasChanged(objecttheClock,TimeInfoEventArgsti) { Console.WriteLine(CurrentTime:{0}:{1}:{2}, ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
} } //lpngkskinthhai publicclassLogCurrentTime
{ publicvoidSubscribe(ClocktheClock) { theClock.OnSecondChange+= newClock.SecondChangeHandler(WriteLogEntry); } //thngthngphngthcnyvitrafile //nhngtrongminhhanychngtachxut //ramnhnhconsolemthi publicvoidWriteLogEntry(objecttheClock,TimeInfoEventArgsti) { Console.WriteLine(Loggingtofile:{0}:{1}:{2}, ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString()); } } //lpTestminhhasdngskinpublic classTest { publicstaticvoidMain() { //toraitngclock ClocktheClock=newClock(); //toitngDisplayClockngk //skinvxlskin DisplayClockdc=newDisplayClock(); dc.Subscribe(theClock); //toitngLogCurrentvyucung //kvxlskin LogCurrentTimelct=newLogCurrentTime(); lct.Subscribe(theClock); //btuthchinvnglpvphtsinhskin //trongmigiyngh } theCloc k.Run(); } }
----------------------------------------------------------------------------iu quan trng chnh ca v d minh ha trn l vic to ra hai lp i tng DisplayClock v lp LogCurrentTime. C hai lp ny u ng k mt s kin Clock.OnSecondChangeca lp th ba l lp Clock Li ch ca c ch publish/subscribe l bt c lp no cng c th c cnh bo khi mt s kin xut hin. Nhng lp subscriber khng cn bit cch m Clock lm vic, v
Clockcng
Publisher v subscriber c phn tch bi delegate, y l mt s mong i cao, n lm cho m lnh linh hat v mnh m hn. Lp Clock c th thay i cch d thi gian m khng lm nh hng n bt c lp subscriber no. Cc lp subscriber c th thay i cch m chng p ng vi s thay i ca thi gian m khng tc ng vi Clock. C hai lp ny hot ng c lp vi nhau, v lm cho on chng trnh d duy tr hn.
Cu hi v tr li
Cuhi 1: Tm tt nhng nt c bn v u quyn? Tr li 1: y quyn l mt kiu d liu tham chiu c dng ng gi phng thc vi cc tham s v kiu tr v xc nh. y quyn cng tng t nh con tr hm trong ngn ng C++. Tuy nhin, trong ngn ng C# y quyn l kiu d liu hng i tng, an ton v bo mt. Cuhi 2: Con tr hm l g? Tr li 2: Trong ngn ng nh C hay C++, c mt chc nng gi l con tr hm. Mt con tr hm c s dng thit lp cng mt nhim v nh mt y quyn. Tuy nhin, con tr hm trong C/C++ n gin khng phi l mt i tng. Cn y quyn trong C# l kiu d liu an ton, c dng tham chiu n nhng phng thc, y quyn cn c s dng bi nhng s kin.
Cu hi thm
Cu hi 1: C th s dng y quyn nh mt thuc tnh hay khng? Nu c th th s dng nh th no? Cho bit ngha?
Cu hi 2: Nu c mt s hot ng cn c thc hin theo mt th t nht nh th ta phi lm th no khi cn thc hin th gi ln lt thc hin cc hot ng ?
Cu hi 3: Cng dng ca vic khai bo y quyn tnh? Khi no th nn khai bo y quyn tnh khi no th khng nn? Cu hi 4: Mt y quyn c th gi c nhiu hn mt phng thc hay khng? Chc nng no trong C# h tr y quyn ny? Cu hi 5: C phi tt c cc y quyn u l y quyn Multicast hay khng? iu kin tr thnh y quyn Multicast? Cuhi 6: Cc ton t no c th dng thc hin vic Multicast cc y quyn? Cuhi 7: S kin l g? Trong h thng ng dng no th s kin c s dng nhiu? Cuhi 8: Nhng s kin trong C# c thc hin thng qua ci g? Cu hi 9: Hy tm lc qu trnh to mt s kin v gii quyt s kin thng qua c ch y quyn trong C#?
Bi tp
Bi tp 1: Vit chng trnh minh ha s dng y quyn thc hin vic sp xp cc s nguyn trong mt mng? Bi tp 2: Vit chng trnh minh ha s dng y quyn thc hin vic chuyn cc k t thng thnh k t hoa trong mt chui? Bi tp 3: Vit chng trnh kt hp gia delegate v s kin minh ha mt ng h in t th hin gi hin hnh trn mn hnh console.
Chng 12
CC LP C S .NET
Lp i tng trong .NET Framework Lp Timer Lp v th mc & h thng Lp Math Lp thao tc tp tin Lm vic vi tp tin d liu Cu hi & bi tp
Cho n lc ny th chng ta tm hiu kh nhiu cc lp i tng m ngn ng C# cung cp cho chng ta. V hin ti chng ta c th vit c cc chng trnh C# thun ty dng console lm giao din kt xut. i vi vic tm hiu bt c ngn ng lp trnh no th vic vit cc chng trnh m giao din cng n gin th cng tt. Trong phn th hai (t chng 14) ca gio trnh chng ta s tm hiu xy dng cc ng dng Windows thng qua Visual C#. Trong chng ny chng ta s tm hiu cc lp c s m .NET cung cp, cc lp ny n gin gip chng ta thc hin tt cc thao tc nhp xut, cc thao tc truy cp h thng, thc thi cc php ton hc,...
640
Cc Lp C S .NET
CLS l mt tp hp cc lut hay cc quy tc m tt c cc ngn ng thc hin bn trong .NET platform phi tun th theo. Tp hp lut ny cng bao gm kiu d liu h thng chung, cc kiu d liu c bn m chng ta c tm hiu trong chng 3 - Nn tng ngn ng C#. Bng cch a vo cc tp lut ny, mi trng thc thi chung s c th thc thi mt chng trnh m khng quan tm n c php ca ngn ng c s dng. Li ch theo sau ca CLS l m ngun c vit trong mt ngn ng c th c gi s dng bi mt ngn ng khc Bi v thng thng bn trong Framework vi CLS, chng c th s dng khng ch ngn ng C# m cn bt c ngn ng tng thch vi CLS nh l Visual Basic.NET v JScript.NET.
trng thc thi m chng c vit h tr C#. V d, Microsoft thm vo mt vi namespace vi SDK ca n nh Microsoft.VisualBasic, Microsoft.CSharp, Microsoft.Jscript v
Microsoft.Win32.
Lp Timer
Chng ta bt u vi v d u tin 12.1. V d minh ha ny ht sc n gin v c thit k khng c tt. V d 12.1: Hin th thi gian. ----------------------------------------------------------------------------//Timer01.cs:Hinthngyvthigian //nhnCtrl+Cthotnamespace Programming_CSharp { usingSystem; publicclassTester { publicstaticvoidMain() { while(true) { Console.WriteLine(\n{0},DateTime.Now); } } } }
----------------------------------------------------------------------------Kt qu:
12/24/2001 ....... ....... 3:21:20 PM
----------------------------------------------------------------------------Nh chng ta c th thy, kt qu chng trnh c thc thi vo lc 3:21 vo ngy 24 thng 12. Danh sch ny th hin mt ng h xut hin dng lnh, v chng dng nh l c
cp nht trong mi giy ng h. Tht vy, n thng thng c cp nht nhiu hn mt ln, do chng ta lu l giy ng h thay i ch khi gi tr xut hin tht s khc nhau. Chng trnh s chy mi n khi no ta nhn thot bng Ctrl + C. Trong chng trnh ta s dng kiu d liu DateTime, y l mt cu trc c cha trong namespace Systembn trong th vin c s. Cu trc ny c mt thuc tnh tnh l Nowtr v thi gian hin hnh. C nhiu d liu thnh vin v nhng phng thc c thm vo trong cu trc DateTime. Chng ta c th tm hiu thm v DateTime trong th vin trc tuyn v cc lp c s ca .NET Framework. Cch tt nht hin th ngy gi trn mn hnh l s dng Timer. Mt Timercho php mt x l (hnh thc ca mt delegate) c gi ti mt thi gian xc nh hay sau mt chu k no tri qua. Framework cha mt lp Timer bn trong namespace System.Timers. Lp ny c s dng trong v d 12.2 theo sau: V d 12.2: S dng Timer. ----------------------------------------------------------------------------//Timer02.cs:hiuthngygisdngTimer //nhnCtrl+ChayqvEnterthot namespaceProgramming_CSharp { usingSystem; usingSystem.Timers; publicclassTester { publicstaticvoidMain() { TimermyTimer=newTimer(); //khaibohmxl myTimer.Elapsed+=newElapsedEventHandler(DisplayTimeEvent); // khong thi gian delay myTimer.Interval myTimer.Start(); //thchinvnglpchthotwhile (Console.Read()!=q) { } ; //khnglmght! } public static = 1000;
voidDisplayTimeEvent(objectsource,ElapsedEventArgst) {
Console.Write(\n{0},DateTime.Now); } } }
----------------------------------------------------------------------------Kt qu:
12/24/2001 ...... ...... 3:45:20 PM
----------------------------------------------------------------------------Kt qu thc hin cng ging nh v d trc. Tuy nhin, chng trnh ny thc hin tt hn nhiu so vi chng trnh ban u. Thay v cp nht khng ngng ngy gi c hin th, chng trnh ny ch cp nht sau khong 1 giy. Chng ta hy xem k cch m Timer lm vic. Mt i tng Timer mi c to ra, thuc tnh Interval c thit lp. Tip theo phng thc s c thc hin sau khong thi gian interval c gn vi Timer. Trong trng hp ny l phng thc DisplayTimeEvent s c thc thi, phng thc c nh ngha bn di. Khi Timer thc hin phng thc Start th n s bt u tnh interval. Mt thuc tnh thnh vin khc ca Timer l AutoReset m chng ta cng cn bit l: nu chng ta thay i gi tr mc nh ca n t true sang false, th s kin Timer ch thc hin duy nht mt ln. Khi AutoReset c gi tr true hay ta thit lp gi tr true th Timer s kch hot s kin v thc thi phng thc mi mt thi gian c a ra (interval). Trong chng trnh ny vn cha mt vng lp thc hin n khi no ngi dng nhn k t q v Enter. Nu khng chng trnh thc hin tip tc vng lp. Khng c g thc hin trong vng lp ny, nu mun chng ta c th thm vo trong vng lp nhng x l khc. Chng ta cng khng cn thit phi gi phng thc DisplayTimeEvent trong vng lp bi v n s c gi t ng vo khong thi gian xc nh interval.
Timer trong
kin ca Timercng c th c s dng cho nhiu chng trnh khc. Nh chng ta c th to Timer tt mt chng trnh khc vo mt thi im a ra. Chng ta cng c th to chng trnh backup thng xuyn sao chp nhng d liu quan trng theo mt nh k thi gian no . Hay chng ta cng c th to mt chng trnh t ng log off mt ngi s dng hay kt thc mt chng trnh sau mt khong thi gian m khng c bt c hot ng no xy ra. Ni chung l c rt nhiu cch s dng Timer ny, v lp
Timerny
rt ha ch.
Lp v th mc v h thng
i khi chng ta cn bit thng tin h thng ca my m chng trnh ang thc hin, iu ny khng kh khn g, .NET h tr mt s lp c bn thc hin vic ny. Trong v
d minh ha 12.3 bn di s trnh by cch ly cc thng tin v my tnh v mi trng ca n. Vic thc hin ny thng qua s dng lp Environment, trong lp ny cha mt s d liu thnh vin tnh v chng ta s th v vi thng tin ca chng. V d 12.3: S dng lp Environment. ----------------------------------------------------------------------------//env01.cs:hinththngtincalpEnvironment namespaceProgramming_CSharp { usingSystem; classTester { publicstaticvoidMain() { //ccthuctnhConsole.WriteLine(**************************); Console.WriteLine(Command:{0},Environment.CommandLine); Console.WriteLine(CurrDir:{0},Environment.CurrentDirectory); Console.WriteLine(SysDir:{0},Environment.SystemDirectory); Console.WriteLine(Version:{0},Environment.Version); Console.WriteLine(OSVersion:{0},Environment.OSVersion); Console.WriteLine(Machine:{0},Environment.MachineName); Console.WriteLine(Memory:{0},Environment.WorkingSet); //dngmtviccphngthc Console.WriteLine(**************************);string[]args= Environment.GetCommandLineArgs();for(inti=0;i< args.Length;i++) { Console.WriteLine(Arg{0}:{1},i,args[i]); } Console.WriteLine(**************************); string[]drivers=Environment.GetLogicalDrives(); for(inti=0;i<drivers.Length;i++) { Console.WriteLine(Drive{0}:{1},i,drivers[i]); }
Console.WriteLine(**************************); } } }
----------------------------------------------------------------------------Nh chng ta thy th nhng thnh vin tnh ca lp Environment cung cp cho ta nhng thng tin h thng v mi trng. u tin l lnh thc hin c a ra chnh l chng trnh ang thc thi tc l chng trnh Env01.exe, thuc tnh c dng ly l CommandLine. Th mc hin hnh chnh l th mc cha chng trnh thc thi thng qua thuc tnh CurrentDirectory. Tng t nh vy cc thuc tnh h thng nh: th mc h thng, phin bn OS, tn my tnh, b nh cng c ly ra. Tip theo l hai phng thc ca lp Environment tr v mng chui k t, bao gm phng thc ly i mc dng lnh GetCommandLineArgsv phng thc nhn thng tin v a logic trong my tnh GetLogicalDrives. Hai vng lp n gin l xut gi tr tng thnh phn trong mng ra.Cui cng l phng thc GetEnvironmentVariable nhn bin mi
Lp Math
T u ti gi chng ta ch thc hin cc php ton c bn nh cng, tr, nhn, chia, chia d. Cn rt nhiu cc php ton mnh hn v cng thng s dng m chng cha c cp ti. C# cung cp mt tp hp cc php ton ton hc bn trong nhng lp c s. Chng c cha bn trong ca namespace System.Math. Bng 12.1 sau lit k nhng hm ton hc. Lp Math l lp sealed, do chng ta khng th xy dng mt lp mi m k tha t lp ny c. Thm vo tt c nhng lp v d liu thnh vin u l tnh, do vy chng ta khng th to mt i tng c kiu Math. Thay vo chng ta s s dng nhng thnh vin v phng thc vi tn lp. Lp Math Phng thc
Abs Ceiling Exp Floor IEEERemainder
M t Tr v tr tuyt i ca mt s Tr v gi tr nh nht hay bng gi tr a ra Tr v gi tr e vi m a ra Tr v gi tr ln nht hay bng gi tr a ra Tr v phn d ca php chia hai hai s thc. Php chia ny theo tiu chun ca IEEE cho php ton du Tr v gi tr logarit ca gi tr a ra Tr v gi tr logarit c s 10 ca s a ra Tr v s ln trong hai s Tr v s nh trong hai s Tr v kt qu x Tr v gi tr c lm trn Tr v gi tr du ca mt s. -1 nu s m v 1 nu s ng bc hai ca mt s Tr d v cn Tr v gi tr mt gc m cosinbng vi gi tr a ra Tr v gi tr mt gc m sinbng vi gi tr a ra Tr v gi tr ca mt gc m tang bng vi gc a ra v gi tr ca mt gc m tang bng vi tang Tr ca im gi a ra ca mt gc a ra Tr v (x,y) tr cosin
y
Log Log10 Max Min Pow Round Sign Sqrt Acos Asin Atan Atan2 Cos
Cosh Sin
Tr v gi tr hyperbolic ca gc a ra Tr v gi tr tang ca gc Tr v gi tr hyperbolic tang ca gc. Hnh 12.1 : Phng thc ca Math.
Ngoi ra lp Mathny cng a vo hai hng s: PIv s E, PItr v gi tr pi trong ton hc nh l 3.14159265358979323846Gi tr Etr v gi tr 2.7182818284590452354. Hu ht cc hm ton hc trong bng 12.1 trn d hiu v d s dng. V d 12.4 sau minh ha vic s dng mt s hm ton hc nh sau: V d 12.4: S dng mt vi hm ton hc. ----------------------------------------------------------------------------usingSystem; namespaceProgramming_CSharp { publicclassTester { publicstaticvoidMain() { intval2; charch; for(doublectr=0.0;ctr<=10;ctr+=.2) { val2=(int)System.Math.Round((10*System.Math.Sin(ctr))); for(intctr2=10;ctr2<=10;ctr2++) { if(ctr2==val2) ch='x'; else ch=''; Console.Write("{0}",ch); } Console.WriteLine(""); } } } }
-----------------------------------------------------------------------------
t qu: x
x xx x x x x x x x x x x x x x x x x x x x x x x x x xx x xx x xx x x x
x xx xx x x x x x x x ----------------------------------------------------------------------------Vng lp u tin thc hin thng qua mt bin lp l mt gi tr double, mi bc lp tng . 2. Gi tr Sin c ly thng qua vic s dng hm Math.Sin. Do gi tr Sin t -1 n 1 v cho d hin th hn, gi tr ny c chuyn t -10 n 10. chuyn thnh gi tr ny th ta nhn vi 10 ri sau thc hin vic lm trn bng cch dng hm Round ca
Math.
Lp thao tc tp tin
Kh nng vit thng tin vo trong mt tp tin hay c thng tin t trong mt tp tin c th lm cho chng trnh ca chng ta c nhiu hiu qu hn. Hn na, c rt nhiu ln khi chng ta mun c kh nng lm vic vi nhng tp tin hin hu. Phn tip sau chng ta s tm hiu nhng c tnh c bn ca vic thao tc trn tp tin. iu ny s c theo sau bi mt khi nim quan trng ca tp tin l lung (stream).
M t Ni vn bn vo trong mt tp tin
Copy
To ra mt tp tin mi mt v tr xc nh To ra tp tin lu gi text Xa tp tin v tr xc nh. Tp tin phi hin hu nm tra xem pp tin c thc sl. n hu v tr Ki u khng s tht sinh ra ngoi hi no . thng tin thuc tnh ca tp tin. Thng tin Ly ny bao gm: tp tin c b nn hay khng, tn th mc, c
Tr v ngy gi tp tin c to ra Tr v ngy gi tp tin c truy cp ln cui Tr v ngy gi tp tin c vit ln cui Cho php tp tin c di chuyn vo v tr mi v i tn tp tin. M mt tp tin ti v tr a ra. Bng vic m tp tin ny chng ta c th vit thng tin hay c thng tin t M mt tp tin hin hu c M mt tp tin c dng text M mt tp tin xc nh vit Thit lp thuc tnh cho tp tin Thit lp ngy gi to tp tin
Thit lp li ngy gi m tp tin c truy cp ln cui lp ngy gi m tp tin c cp nht ln Thit SetLastWriteTime cu s i. Bng 12.2 : Mt phng thc chnh thao tc tp tin. Chng trnh 12.5 sau minh ha vic sao chp mt tp tin. V d 12.5: Sao chp mt tp tin. ----------------------------------------------------------------------------//file:filecopy.cs:saochpmttptin //sdngthamsdnglnh namespaceProgramming_CSharp { usingSystem;using System.IO;public classTester { publ
icstaticvoidMain()
{ string[]CLA=Environment.GetCommandLineArgs(); if(CLA.Length<3) { Console.WriteLine(Format:{0}origfilenewfile,CLA[0]); } else { stringorigfile=CLA[1];string newfile try { File.Copy(origfile,newfile); } catch(System.IO.FileNotFoundException) { Console.WriteLine(\n{0}doesnotexist!,origfile); return; } catch(System.IO.IOException) { Console.WriteLine(\n{0}alreadyexist!,newfile); return; } catch(Exceptione) { Console.WriteLine(\nAnexceptionwasthrowntryingtocopyfile); Console.WriteLine(); return; } Console.WriteLine(...Done); } } } = CLA[2];
Console.Write(Copy...);
-----------------------------------------------------------------------------
Chng trnh thc hin bng cch sau khi bin dch ra tp tin filecopy.exe ta gi thc hin tp tin ny vi tham s dng lnh nh sau:
filecopy.exefilecopy.csfilecopy.bak
Tp tin filecopy.cs hin hu v tp tin filecopy.bak th cha hin hu cho n khi lnh ny thc thi. Sao khi thc thi xong chng trnh tp tin filecopy.bak c to ra. Nu chng ta thc hin chng trnh ln th hai cng vi cc tham s nh vy, th chng ta s nhn c kt qu xut nh sau:
Copy... filecopy.bakalreadyexists!
Nu chng ta thc hin chng trnh m khng c bt c tham s no, hay ch c mt tham s, chng ta s nhn c kt qu nh sau :
Formatd:\working\filecopy\filecopy.exeorigfilenewfile
Cui cng, iu t nht xy ra l chng ta thc hin sao chp nhng tp tin ngun khng tn ti:
Copy... filecopy.csdoesnotexist!
Nh chng ta ta thy tt c cc kt qu c th c ca chng trnh minh ha 12.5 trn. Chng trnh thc hin vic sao chp mt tp tin v n kim tra tt c cc tnh hung c th c v thc hin vic x l cc ngoi l. iu ny cho thy chng trnh va p ng c mt logic ca lp trnh va p ng c vic x l cc ngoi l. Nh chng ta bit trong lnh sau:
string[]CLA=Environment.GetCommandLineArgs();
thc hin vic ly cc tham s dng lnh c cp cho chng trnh. Lp Environmentny chng ta tm hiu v s dng trong phn trc. Lnh sau kim tra xem chng trnh c nhn c t hn gi tr tham s dng lnh hay khng.
if(CLA.Length<3) { Console.WriteLine(Format:{0}origfilenewfile,CLA[0]); }
Nu gi tr ny nh hn 3, ngi s dng khng cung cp thng tin. Nn nh rng, s dng phng thc GetCommandLineArgs, th gi tr u tin m chng ta nhn c l tn ca chng trnh. Phn cn li l cc tham s dng lnh c theo sau. iu ny c ngha rng chng ta cn thit 3 gi tr: tn chng trnh, tn tp tin ngun, tn tp tin mi.
Nu chng ta nhp vo khng 3 tham s dng lnh, th chng trnh s xut ra thng bo vi tn ca chng trnh thc hin c c bi GetCommandLineArgs. Nu cung cp y cc tham s, vic x l sao chp s c thc hin. d theo di th chng trnh xut ra thng bo vic sao chp file:
Console.Write(Copy...); .....Console.WriteLine(...Done);
Mc dng vic sao chp tp tin khng c g phc tp, nhng chng ta lu rng trong chng trnh trn chng ta c thm vo cc on x l ngoi l. Vic gi hm Copyca File c bao bc trong khi try, v sau l ba th hin ca Catchtheo sau. Bi v c rt nhiu th c th gy ra li do cc hot ng trn tp tin, ngh rng chng ta nn m bo cho chng trnh ca chng ta thc hin vic bt gi v x l cc ngoi l tng ng. Hu ht nhng phng thc File c nhng ngoi l c nh ngha cho mt s cc li quan trng c th xut hin. Khi chng ta tra cu ti liu trc tuyn cho mt lp. Chng ta s tm thy bt c nhng ngoi l no c nh ngha cho phng thc a ra. Mt cch thc hnh lp trnh tt l thm vo cc on x l ngoi l vi bt c ngoi l no c th xut hin. Trong chng trnh ngoi l u tin c x l cho vic gi hm Copy()l:
catch(System.IO.FileNotFoundException) { Console.WriteLine(\n{0}doesnotexist!,origfile); return; }
Ngoi l ny c pht sinh khi mt tp tin m chng ta c sao chp khng tm thy, ngoi l ny c t tn l FileNotFoundException. Ngoi l tip theo c bt l IOException. Ngoi l ny c pht sinh t mt s ngoi l khc. Bao gm mt th mc khng tm thy (DirectoryNotFoundException), kt thc ca tp tin khng c tm thy (EndOfStreamException), c li c tp tin (FileLoadException), hay l li tp tin khng c tm thy, nhng ngoi l ny s c bt trong x l ngoi l bn trn. Ngoi l ny cng c pht sinh khi tp tin m chng ta cn to mi tn ti. Cui cng, chng ta s bt gi nhng ngoi l khng mong i cn li bng s dng ngoi l chung hay ngoi l tng qut. Bi v chng ta khng bit nguyn nhn ca vic xy ra ngoi l, y ch c th hin th thng ip ca chnh bn thn ngoi l pht sinh. Ghi ch: Nn s dng x l ngoi l khi thao tc trn tp tin. Phong cch lp trnh tt l khng nn ngh rng ngi s dng s cung cp cho chng trnh mi th m chng trnh cn nht l khi s dng tham s dng lnh.
s dng lp ny. Trong chng trnh ny s ly mt tn tp tin v hin th kch thc v nhng ngy quan trng lin quan n vic to, b sung tp tin. V d 12.6: S dng lp FileInfo.
----------------------------------------------------------------------------//Filsize.cs namespaceProgramming_CSharp { usingSystem;using System.IO;public classTester { publicstaticvoidMain() { string[]CLA=Environment.GetCommandLineArgs();FileInfo fiExe=newFileInfo(CLA[0]); if(CLA.Length<2) { Console.WriteLine(Format:{0}filename,fiExe.Name); } else { try { FileInfofiFile=newFileInfo(CLA[1]); if(fiFile.Exists) { Console.WriteLine(******************************); Console.WriteLine({0} {1},fiFile.Name,fiFile.Length);
catch(System.IO.FileNotFoundException) {
Console.WriteLine(\n{0}doesnotexists!,CLA[1]); return; } catch(Exceptione) { Console.WriteLine(\nAnexceptionwasthrowntryingtocopyfile); Console.WriteLine(); return; }//endcatch }//endelse }//endMain }//endclass }//endnamespace
----------------------------------------------------------------------------Kt qu:
****************************** filesize.cs 1360 ****************************** Last access: 12/5/2002 12:00:00 AM Last write: 12/5/2002 5:50:50 PM Creation: 12/5/2002 5:53:31 PM ******************************
Tham s ca b khi dng lp FileInfo xc nh tn ca tp tin m n s cha nhn thng tin, trong trng hp ny n s ly tham s th hai ca tham s dng lnh lm tp tin m n s thc hin. Nu ngi dng khng nhp tn tp tin th chng trnh s in ra tn ca chng trnh.
Nhiu ngi nhm ln v s khc nhau gia tp tin v lung. Mt lung n gin l lung ca thng tin, cha thng tin s c chuyn qua, cn tp tin th lu tr thng tin. Mt lung c s dng gi v nhn thng tin t b nh, t mng, web, t mt chui,...Mt lung cn c s dng i vo v ra vi mt tp tin d liu.
Th t ca vic c mt tp tin
Khi c hay vit mt tp tin, cn thit phi theo mt trnh t xc nh. u tin l phi thc hin cng vic m tp tin. Nu nh to mi tp tin, th vic m tp tin cng lc vi vic to ra tp tin . Khi mt tp tin m, cn thit phi to cho n mt lung t thng tin vo trong mt tp tin hay l ly thng tin ra t tp tin. Khi to mt lung, cn thit phi ch ra thng tin trc tip s c i qua lung. Sau khi to mt lung gn vi mt tp tin, th lc ny chng ta c th thc hin vic c ghi cc d liu trn tp tin. Khi thc hin vic c thng tin t mt tp tin, chng ta cn thit phi kim tra xem con tr tp tin ch ti cui tp tin cha, tc l chng ta c n cui tp tin hay cha. Khi hon thnh vic c ghi thng tin trn tp tin th tp tin cn phi c ng li. Tm li cc bc c bn lm vic vi mt to tin l: Bc 1: M hay to mi tp tin Bc 2: Thit lp mt lung ghi hay c t tp tin Bc 3: c hay ghi d liu ln tp tin Bc 4: ng lp tin li
M mt tp tin v tp tin ny c th c thm vn bn vo trong To lung StreamWriters dng thm vo trong vn bn.
n.
Create CreateText
M mt tp tin c/vit. M mt FileStream M mt tp tin c M mt tp tin vn bn c. To ra StreamReader s dng. M mt tp tin cho vic c v ghi.
Lm th no chng ta c th bit c khi no s dng lp Filechnh xc hn l s dng lp FileInfonu chng cng cha nhng phng thc tng t vi nhau. Tht ra hai lp ny c nhiu s khc bit. Lp Filecha tt c cc phng thc tnh, thm vo lp Filet ng kim tra permission trn mt tp tin. Trong khi nu mun dng lp FileInfoth phi to th hin ca lp ny. Nu mun m mt tp tin ch mt ln th tt nht l s dng lp
File,
nht l ta dng lp FileInfo. Hoc nu khng chc chn cch s dng th chng ta c th s dng lp FileInfo.
Vit vo mt tp tin vn bn
Cch tt nht nm vng cch thc lm vic vi tp tin l chng ta s bt tay vo tm hiu chng trnh. Trong phn ny chng ta s tm hiu mt v d minh ha vic to ra mt tp tin vn bn ri sau vit li thng tin vo n. V d 12.7: Vit d liu vo tp tin vn bn. ----------------------------------------------------------------------------//writing.cs::vitvomttptinvnbn namespaceProgramming_CSharp { usingSystem;using System.IO;public classTester { publicstaticvoidMain(String[]args) { if(args.Length<1) { Console.WriteLine(Phainhaptentaptin.); } else { StreamWritermyFile=File.CreateText(args[0]); myFile.WriteLine(Khongcoviecgikho); myFile.WriteLine(Chisolongkhongben);
myFile.Write({0},i); } myFile.Close(); } } } }
----------------------------------------------------------------------------Khi chy chng trnh trn chng ta phi cung cp tn ca tp tin c to mi, nu khng cung cp th chng trnh s khng thc hin vic to tp tin. Gi s chng ta c cung cp mt tham s dng lnh cho chng trnh th mt tp tin vn bn mi c to ra c ni dung nh sau:
KhongcoviecgikhoChi solongkhongbenDao nuivalapbienQuyetchi atlamnen 0123456789
Trong chng trnh trn khng thc hin vic x l ngoi l. iu ny dn n chng trnh c th pht sinh ra nhng ngoi l v nhng ngoi l ny khng c x l. y l cch lp trnh khng tt, nn yu cu ngi c nn thm cc x l ngoi l vo chng trnh trn, ngoi l ny cng tng t nh ngoi l trong v d trc. Nh chng ta thy hm Mainc tham s v tham s ny s c nhn thng qua dng lnh, trong cc v d trc, chng trnh nhn tham s dng lnh thng qua lp Environment, cn y ta khai bo tham s dng lnh trc tip cho chng trnh. Dng lnh u tin ca hm Main() l kim tra s tham s nhp vo, nu khng c tham s no chng trnh s xut ra thng bo l khng c tn tp tin v kt thc chng trnh. Trong trng hp cung cp tham s y chng trnh s thc hin vic to mi tp tin. Phng thc CreateTextca lp Filec gi to ra mt i tng StreamWritermi gi l myFile. Tham s c truyn cho hm l tn ca tp tin s c to. Kt qu cui cng ca dng lnh ny l to ra mt tp tin vn bn mi. D liu s4 c a vo tp tin thng qua StreamWritervi th ca n l myFile. Ghi ch: Nu mt tp tin hin hu vi cng tn nh tp tin m chng ta to ra th tp tin c s c vit chng, tc l d liu bn trong tp tin c s b xa mt. Hnh sau minh ha vic thc hin to tp tin v a d liu vo
Hnh 12.3 : M t thc hin to tp tin v a d liu vo Khi mt lung c thit lp v ch n mt tp tin, chng ta c th vit vo trong lung v n s c vit vo tp tin:
myFile.WriteLine(Khongcoviecgikho);
Dng lnh trn vit mt chui vo trong tp tin, vic vit ny ging nh l vit ra mn hnh console. Nhng y l c vit ra thit b khc, tc l ra tp tin. Sau khi thc hin ton b cng vic, cn thit phi ng lung li bng cch gi phng thc Close.
c tp tin vn bn
c d liu t tp tin vn bn cng tng t nh vic vit thng tin vo n. V d minh ha tip sau y thc hin vic c tp tin m chng ta to ra t chng trnh minh ha 12.7 trc. y l chng trnh c tp tin vn bn. V d 12.8: c mt tp tin vn bn. ----------------------------------------------------------------------------usingSystem; usingSystem.IO; namespaceProgramming_CSharp { publicclassTester { publicstaticvoidMain(string[]args) { if(args.Length<1) { Console.WriteLine(Phainhaptentaptin); }
else {
----------------------------------------------------------------------------Nu chng ta nhp ng tn ca tp tin va to trong v d trc th kt qu chng trnh thc hin nh sau: ----------------------------------------------------------------------------Kt qu:
Khong co viec gi kho Chi so long khong ben Dao nui va lap bien Quyet chi at lam nen 0 1 2 3 4 5 6 7 8 9
----------------------------------------------------------------------------Nu chng trnh c cung cp y tn tp tin th n s bt u thc hin vic c thng tin. u tin l khai bo mt chui dng lm ch lu thng tin c t tp tin ra. m tp tin vn bn th phng thc OpenText c gi. Phng thc ny c truyn vo tn ca tp tin vn bn cn m. Mt ln na mt lung tn myFile c to ra gn vi tp tin cho, lung ny c kiu l StreamReader. Phng thc ReadLine()ca myFilethc hin vic c tng dng trong tp tin v sau c xut ra mn hnh console. Vic c ny kt hp vi vic kim tra l c n cui tp tin cha, nu c n cui tp tin, tc l hm ReadLine() tr v chui rng, lc ny chng trnh s kt thc vic c. Cui cng hm Closec gi ng tp tin li, v chng trnh chm dt. Trong chng trnh ny cng khng x l ngoi l, nu tp tin khng tn ti chng trnh s pht sinh ra ngoi l v ngoi l ny khng c x l. ngh ngi c nn a vo cc on x l ngoi l tng t nh v d 12.6
Nu chng ta s dng mt tp tin vn bn, th khi chng ta lu d liu kiu s th phi thc hin vic chuyn i sang dng chui k t lu vo trong tp tin vn bn v khi ly ra
ta cng ly c gi tr chui k t do ta phi chuyn sang dng s. i khi chng ta mun c cch thc no tt hn lu trc tip gi tr vo trong tp tin v sau c trc tip gi tr ra t tp tin. V d khi vit mt s lng ln cc s integer vo trong tp tin nh l nhng s nguyn, th khi ta c th c cc gi tr ny ra nh l s integer. Trng hp nu chng c vit vo tp tin vi dng vn bn, th khi c ra ta phi c ra vn bn v phi chuyn mi gi tr t mt chui n cc s integer. Tt hn vic phi thc hin thm cc bc chuyn i, ta c th gn mt kiu lung nh phn BinaryStreamvo trong mt tp tin, ri sau c v ghi thng tin nh phn t lung ny. Tip theo ta s xem mt v d minh ha vic c vit d liu nh phn vo mt tp tin. Mc d trong chng trnh ny thc hin vic vit 100 gi tr integer vo trong mt tp tin nhng c th d dng vit bt c kiu d liu no khc. Ghi ch: Thng tin nh phn l thng tin c nh dng kiu lu tr d liu. V d 12.9: Vit vo mt tp tin nh phn. ----------------------------------------------------------------------------//binarywriter.cs usingSystem;using System.IO; namespaceProgramming_CSharp { publicclassTester { publicstaticvoidMain(string[]args) { if(args.Length<1) { Console.WriteLine(Phainhaptentaptin!); } else { FileStreammyFile=newFileStream(args[0],FileMode.CreateNew); BinaryWriterbwFile=newBinaryWriter(myFile); for(inti=0;i<100;i++) { bwFile.Write(i); } bwFile. Close() ; myFile
.Close(); }
} } }
----------------------------------------------------------------------------Cng tng t nh cc v d trn th tn tp tin c a vo tham s dng lnh. Nu chng trnh c nhp cc tham s y , chng trnh s thc hin vic vit thng tin nh phn vo trong tp tin, v khng c output ra mn hnh console. Nu chng ta m tp tin v xem th ch thy cc k t m rng c th hin, s khng thy nhng s c c. Trong chng trnh ny cng cha thc hin vic x l cc ngoi l. Nu thc hin vic vit thng tin vo mt tp tin hin hu, th mt ngoi l s c pht sinh khi thc hin lnh:
FileStreammyFile=newFileStream(args[0],FileMode.CreateNew);
Trong chng trnh 12.9 ny thc hin vic to v m tp tin khc vi vic m tp tin vn bn. Lnh trn to mt i tng FileStream gi l myFile. Lung ny c gn vi tp tin thng qua b khi dng. Tham s u tin ca b khi dng l tn ca tp tin m chng ta to (args[0]), tham s th hai l mode m chng ta m. Tham s ny l gi tr kiu lit k FileMode, trong chng trnh th do chng ta thc hin vic to mi ghi nn s dng gi tr FileMode.CreateNew. Bng 12.3 sau lit k nhng mode gi tr khc trong kiu lit k
FileMode.
Gi tr
Append Create
nh ngha M mt tp tin hin hu hoc to mt tp tin mi To mt tp tin mi. Nu mt tp tin hin hu, n b xa v mt tp tin mi s c to ra vi cng tn.
s
CreateNew Open OpenOrCreate Truncate
To mt tp tin mi. Nu mt tp tin tn ti th mt ngoi l s c pht sinh. M tp tin hin hu. M tp tin hay to tp tin mi nu tp tin cha tn ti M mt tp tin hin hu v xa ni dung ca n. Bng 12.4: Gi tr ca FileMode.
Sau khi to ra FileStream, chng ta cn thit phi thit lp n lm vic vi d liu nh phn. Dng lnh tip theo:
BinaryWriterbwFile=newBinaryWriter(myFile);
Dng ny thit lp mt kiu vit d liu nh phn vo trong lung bng cch khai bo kiu
BinaryWrite.
Vng lp ny thc hin vic vit trc tip gi tr integer vo trong BinaryWrite bwFile bng cch s dng phng thc Write. D liu c vit c th l kiu d liu c bit khc. Trong chng trnh ny th s dng gi tr integer. Khi thc hin xong cc cng vic vit vo tp tin, chng ta cn thit phi ng lung m chng t m.
} Console.WriteLine(....Docxong); brFile.Close();
myFile.Close(); } } } }
----------------------------------------------------------------------------Kt qu:
Dang doc tap tin.... <0> <1> <2> <3> <4> <5> <6> <7> <8> <9> <10> <11> <12> <13> <14> <15> <16> <17> <18> <19> <20> <21> <22> <23> <24> <25> <26> <27> <28> <29> <30> <31> <32> <33> <34> <35> <36> <37> <38> <39> <40> <41> <42> <43> <44> <45> <46> <47> <48> <49> <50> <51> <52> <53> <54> <55> <56> <57> <58> <59> <60> <61> <62> <63> <64> <65> <66> <67> <68> <69> <70> <71> <72> <73> <74> <75> <76> <77> <78> <79> <80> <81> <82> <83> <84> <85> <86> <87> <88> <89> <90> <91> <92> <93> <94> <95> <96> <97> <98> <99> ....Doc xong!
----------------------------------------------------------------------------Vi ng dng ny, chng ta c th c d liu m chng ta vit trong v d trc. Trong v d ny chng ta to ra lung FileStream. Lc ny, mode thao tc ca tp tin c s dng l mode FileMode.Open. Sau chng ta thc hin vic gn lung ny vi lung
BinaryReadertrong dng tip
FileStreammyFile=newFileStream(args[0],FileMode.Open); BinaryReaderbrFile=newBinaryReader(myFile);
Sau khi to ra lung gip cho vic c thng tin nh phn t tp tin, chng trnh bt u c thng qua vng lp:
while(brFile.PeekChar()!=1) { Console.Write(<{0}>,brFile.ReadInt32()); }
y c mt vi s khc nh, phng thc PeekChar ca lp BinaryReader c s dng. Phng thc ny s ly k t k tip trong lung. Nu k t k tip l cui tp tin
th gi tr -1 c tr v. Ngc li, th k t k tip c tr v Khi k t k tip khng phi k t cui tp tin th lnh bn trong vng lp s c mt s integer t i tng BinaryStreambrFile.
Phng thc c s dng c mt s nguyn l ReadInt32, chng ta s dng kiu tn ca Framework tt hn l kiu do C# a ra. Nn nh rng, tt c nhng lp t Framework iu c gi bi ngn ng C# v chng khng phi l mt b phn ca ngn ng C#. Nhng lp ny cn c s dng tt bi nhng ngn ng khc C#. Ngoi ra lp BinaryReadercn c nhng phng thc khc thc hin vic c cc kiu d liu khc nhau. Nhng phng thc c ny c s dng cng vi cch m ReadInt32c s dng trong chng trnh. Bng 12.4 sau lit k mt s phng thc dng c cc kiu d liu. Phng thc
Read ReadBoolean ReadByte ReadBytes ReadChar
ngha c nhng k t v chuyn v tr c sang v tr tip theo. Phng thc ny c np chng gm 3 phng thc. c mt gi tr booleant lung hin thi v chuyn v tr c sang mt byte. c byte k tip t lung hin thi v chuyn v tr c sang 1 byte. n byte t lung hin thi sang mt mng byte v chuyn c v trc sang n tip trong lung hin hnh v chuyn v tr c c v tr k byte. ca lung theo sau s dng m ha v k t xc nh c c t
ReadChars
c n k t t lung hin hnh vo mt mng n k t. V chuyn v tr c ca lung theo sau s dng m ha v k t c gi tr decimalv chuyn v tr c sang 16 byte. c gi tr thc 8 byte v chuyn v tr c sang 8 byte. c gi tr 2 byte integer c du v chuyn v tr c sang 2 byte. gi tr 4 byte integer c du v chuyn v tr c c sang 4 byte. gi tr 8 byte integer c du v chuyn v tr c sang 8 byte c c mt signed byte t lung v chuyn v tr c sang 1 byte. c gi tr thc 4 byte t lung v chuyn v tr c sang 4 byte. c mt chui t lung. Chui c c nh chiu di trc. V c m ha mi ln nh l s nguyn 7 bit.
ReadUInt16
c gi tr 2-byte unsigned integer t lung. S dng m ha th t nh cui (little endian encoding). V chuyn v tr hin
ReadUInt64
c 8-byte unsigned integer t lung hin hnh v chuyn sang 8 byte. Bng 12.4: Cc phng thc c ca BinaryReader.
Cu hi v tr li
Cuhi 1: Cc ngn ng c h tr bi .NET phi tun th theo quy tc no khng? Tr li 1: Nh trnh by bn trn, cc ngn ng .NET phi tun th theo quy nh chung c th hot ng trn nn ca .NET. Nhng quy nh ny c gi l Common Language Specification (CLS). CLS a ra nhng kiu d liu chung v cc tp lut thao tc trn kiu d liu ny, CLS cho php to ra mt mi trng thc thi chung m khng cn quan tm n tng ngn ng c s dng. Li ch ca CLS l m ngun c vit thng nht qun l, m ngun c vit trong ngn ng ny c th c s dng bi mt ngn ng khc. Cu hi 2: Nu mun tm hiu v cc lp c cung cp bi .NET mt cch chi tit th phi tm u? Tr li 2: tm hiu chi tit cc lp ca .NET th chng ta c th tm trong th vin trc tuyn ca Microsoft c tn l MSDN Online, th vin ny cha tt c cc thng tin lin quan n .NET Framework m ngi hc cn quan tm. Th vin ny thng xuyn c cp nht v cha nhng thng tin mi nht v cc phin bn ca .NET.
Cu hi thm
Cuhi 1: truy xut thi gian ca ng h h thng chng ta phi dng lp no? Cuhi 2: Thng tin v my tnh c th c truy xut thng qua lp no? Cuhi 3: Tham s dng lnh l g? Lm th no ly c tham s dng lnh? Cu hi 4: Lp thao tc cc php ton hc c bn? Chng ta c th to th hin ca lp ny hay khng? Cu hi 5: Lp thao tc tp tin File cha trong namespace no? Cc thao tc chnh c thc hin trn tp tin? Cuhi 6: Lp no cung cp cc thng tin v tp tin? Cc phng thc chnh ca lp ny? Cuhi 7: Lung l g? Phn bit gia tp tin v lung? Cuhi 8: C my cch thc to tp tin? Cho bit th t c ca mt tp tin? Cu hi 9: S khc nhau gia lp File v FileInfo? Khi no th s dng lp File tt hn l s dng FileInfo? Cu hi 10: Khi to mt tp tin mi trng vi tn ca mt tp tin c trong cng mt v tr th mc th chuyn g xy ra? Cu hi 11: Nu mun vit d liu nh dng nh l kiu s th dng cch vit vo tp tin dng no?
Bi tp
Bi tp 1: Vit mt chng trnh minh ha vic truy xut thng tin h thng ca my tnh ang s dng. Thng tin ny bao gm: tn my tnh, h iu hnh, b nh, a cng... Bi tp 2: Vit chng trnh minh ha mt my tnh c nhn cho php thc hin cc php ton c bn. Chng trnh hin ra mt menu cc lnh v mi lnh c gn cho mt s: nh cng th s 1, tr s 2, nhn 3,... Cho php ngi dng chn mt lnh thng qua nhp vo s tng ng. Sau cho ngi dng nhp vo tng ton hng ri thc hin php ton v cui cng in kt qu ra mn hnh. Bi tp 3: Vit chng trnh cho php xem thng tin v mt tp tin. Chng trnh cho ngi dng nhp vo tn tp tin ri sau ln lt hin th cc thng tin nh: thuc tnh tp tin, ngy gi to lp, kch thc tp tin... Bi tp4: Vit chng trnh xem tp tin vn bn ging nh lnh type ca DOS. Chng trnh cho php ngi dng nhp tn tp tin thng qua tham s dng lnh. Nu ngi dng khng nhp qua tham s dng lnh th yu cu nhp vo. Bi tp 5: Vit chng trnh cho php ngi dng nhp vo mt mng s nguyn. Sau sp xp mng ny theo th t tng dn ri lu mng vo mt tp tin trn a vi dng nh phn.
Chng 13
X L NGOI L
Pht sinh v bt gi ngoi l
Cu lnh throw Cu lnh catch
Cu lnh finally
Ngn ng C# cng ging nh bt c ngn ng hng i tng khc, cho php x l nhng li v cc iu kin khng bnh thng vi nhng ngoi l. Ngoi l l mt i tng ng gi nhng thng tin v s c ca mt chng trnh khng bnh thng. Mt iu quan trng phn chia gia bug, li, v ngoi l. Mt bug l mt li lp trnh c th c sa cha trc khi m ngun c chuyn giao. Nhng ngoi l th khng c bo v v tng phn vi nhng bug. Mc d mt bug c th l nguyn nhn sinh ra ngoi l, chng ta cng khng da vo nhng ngoi l x l nhng bug trong chng trnh, tt hn l chng ta nn sa cha nhng bug ny. Mt li c nguyn nhn l do pha hnh ng ca ngi s dng. V d, ngi s dng nhp vo mt s nhng h li nhp vo k t ch ci. Mt ln na, li c th lm xut hin ngoi l, nhng chng ta c th ngn nga iu ny bng cch bt gi li vi m hp l. Nhng li c th c on trc v c ngn nga. Thm ch nu chng ta xa tt c nhng bug v d on tt c cc li ca ngi dng, chng ta cng c th gp phi nhng vn khng mong i, nh l xut hin trng thi thiu b nh (out of memory), thiu ti nguyn h thng,... nhng nguyn nhn ny c th do cc chng trnh khc cng hot ng nh hng n. Chng ta khng th ngn 694
X L Ngoi L
nga cc ngoi l ny, nhng chng ta c th x l chng chng khng th lm tn hi n chng trnh. Khi mt chng trnh gp mt tnh hung ngoi l, nh l thiu b nh th n s to mt ngoi l. Khi mt ngoi l c to ra, vic thc thi ca cc chc nng hin hnh s b treo cho n khi no vic x l ngoi l tng ng c tm thy.
695
X L Ngoi L
iu ny c ngha rng nu chc nng hot ng hin hnh khng thc hin vic x l ngoi l, th chc nng ny s b chm dt v hm gi s nhn s thay i n vic x l ngoi l. Nu hm gi ny khng thc hin vic x l ngoi l, ngoi l s c x l sm bi CLR, iu ny dn n chng trnh ca chng ta s kt thc. Mt trnh x l ngoi l l mt khi lnh chng trnh c thit k x l cc ngoi l m chng trnh pht sinh. X l ngoi l c thc thi trong trong cu lnh catch. Mt cch l tng th nu mt ngoi l c bt v c x l, th chng trnh c th sa cha c vn v tip tc thc hin hot ng. Thm ch nu chng trnh khng tip tc, bng vic bt gi ngoi l chng ta c c hi in ra nhng thng ip c ngha v kt thc chng trnh mt cch r rng. Nu on chng trnh ca chng ta thc hin m khng quan tm n bt c ngoi l no m chng ta c th gp (nh khi gii phng ti nguyn m chng trnh c cp pht), chng ta c th t on m ny trong khi finally, khi n s chc chn s c thc hin thm ch ngay c khi c mt ngoi l xut hin.
Cu lnh throw
pht tn hiu mt s khng bnh thng trong mt lp ca ngn ng C#, chng ta pht sinh mt ngoi l. lm c iu ny, chng ta s dng t kha throw. Dng lnh sau to ra mt th hin mi ca System.Exceptionv sau throw n:
thrownewSystem.Exception();
Khi pht sinh ngoi l th ngay tc khc s lm ngng vic thc thi trong khi CLR s tm kim mt trnh x l ngoi l. Nu mt trnh x l ngoi l khng c tm thy trong phng thc hin thi, th CLR tip tc tm trong phng thc gi cho n khi no tm thy. Nu CLR tr v lp Main() m khng tm thy bt c trnh x l ngoi l no, th n s kt thc chng trnh. V d 13.1: Throw ngoi l. ----------------------------------------------------------------------------namespaceProgramming_CSharp
{ usingSystem; publicclassTest {
publicstaticvoidMain() { Console.WriteLine(EnterMain....);Test t=newTest(); t.Func1(); Console.WriteLine(ExitMain...); } publicvoidFunc1() { Console.WriteLine(EnterFunc1...); Func2(); Console.WriteLine(ExitFunc1...); } publicvoidFunc2() { Console.WriteLine(EnterFunc2...);throw newSystem.Exception(); Console.WriteLine(ExitFunc2...); } } }
----------------------------------------------------------------------------Kt qu:
Enter Enter Enter Main.... Func1... Func2...
Exception occurred: System.Exception: An exception of type System.Exception was throw. at Programming_CSharp.Test.Func2() in ... exception01.cs:line 26 at Programming_CSharp.Test.Func1() in ... exception01.cs:line 20 at Programming_CSharp.Test.Main() in ... exception01.cs:line 12
----------------------------------------------------------------------------V d minh ha n gin ny vit ra mn hnh console thng tin khi n nhp vo trong mt hm v chun b i ra t mt hm. Hm Main()to th hin mi ca kiu Test v sau gi hm Func1(). Sau khi in thng ip Enter Func1, hm Func1() ny gi hm
Func2().
System.Exception.
thi s ngng ngay tc khc, v CLR s tm kim trnh x l ngoi l trong hm Func2(). Do khng tm thy y, CLR tip tc vo stackly hm gi trc tc l Func1v tm kim
trnh x l ngoi l. Mt ln na trong Func1cng khng c on x l ngoi l. V CLR tr v hm Main. Ti hm Main cng khng c, nn CLR s gi trnh mc nh x l ngoi l, vic ny n gin l xut ra mt thng ip li.
Cu lnh catch
Trong C#, mt trnh x l ngoi l hay mt on chng trnh x l cc ngoi l c gi l mt khi catchv c to ra vi t kha catch. Trong v d 13.2 sau, cu lnh throwc thc thi bn trong khi try, v mt khi catch c s dng cng b rng mt li c x l. V d 13.2: bt gi ngoi l. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTest { publicstaticvoidMain() { Console.WriteLine(EnterMain...);Test t=newTest(); t.Func1(); Console.WriteLine(ExitMain...); } publicvoidFunc1() { Console.WriteLine(EnterFunc1...); Func2(); Console.WriteLine(ExitFunc1...); } publicvoidFunc2() { Console.WriteLine(EnterFunc2...); try { Console.WriteLine(Enteringtryblock...);throw
newSystem.Exception(); Console.WriteLine(Exitingtryblock...); }
----------------------------------------------------------------------------Kt qu:
Enter Main... Enter Func1... Enter Func2... Entering try block... Exception caught and handled. Exit Func2... Exit Func1... Exit Main...
----------------------------------------------------------------------------V d 13.2 cng tng t nh v d minh ha trong 13.1 ngoi tr chng trnh thm vo trong mt khi try/catch. Thng thng chng ta cng co th t khi try bao quanh nhng on chng trnh tim n gy ra s nguy him, nh l vic truy cp file, cp pht b nh... Theo sau khi tryl cu lnh catchtng qut. Cu lnh catchtrong v d ny l tng qut bi v chng ta khng xc nh loi ngoi l no m chng ta bt gi. Trong trng hp tng qut ny th khi catch ny s bt gi bt c ngoi l no c pht sinh. S dng cu lnh catch bt gi ngoi l xc nh s c tho lun trong phn sau ca chng. Trong v d 13.2 ny, khi catchn gin l thng bo ra mt ngoi l c bt gi v c x l. Trong v d ca th gii thc, chng ta c th a hnh ng ng sa cha vn m gy ra s ngoi l. V d, nu ngi s dng ang c m mt tp tin c thuc tnh ch c, chng ta c th gi mt phng thc cho php ngi dng thay i thuc tnh ca tp tin. Nu chng trnh thc hin thiu b nh, chng ta c th pht sinh cho ngi dng c hi ng bt cc ng dng khc li. Thm ch trong trng hp xu nht ta khng khc phc c th khi catch ny c th in ra thng ip li ngi dng bit.
Th kim tra k li chng trnh 13.2 trn, chng ta s thy xut hin on m i vo tng hm nh Main(), Func1(), Func2(), v c khi try. Chng ta khng bao gi thy n thot khi lnh try(tc l in ra thng bo Exiting try block..., hay thc hin lnh ny), mc d n vn thot ra theo th t Func2(), Func1(), v Main(). Chuyn g xy ra?
Khi mt ngoi l c pht sinh, vic thi hnh ngay lp tc s b tm dng v vic thi hnh s c chuyn qua khi lnh catch. N khng bao gi tr v lung thc hin ban u, tc l cc lnh sau khi pht ra ngoi l trong khi trykhng c thc hin. Trong trng hp ny chng ta s khng bao gi nhn c thng bo Exiting try block..... Khi lnh
catchx
li v sau chuyn vic thc thi chng trnh n cc lnh tip sau khi catch. y khng c vic quay li cuc gi hm trc trong stack. Ngoi l by gi c x l, khng c vn g xy ra, v chng trnh tip tc hot ng bnh thng. iu ny tr nn r rng hn nu chng ta di chuyn khi try/catchln hm Func1nh trong v d minh ha 13.3 bn di. V d 13.3: Catch trong hm gi. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTest { publicstaticvoidMain() { Console.WriteLine(EnterMain...);Test t=newTest(); t.Func1(); Console.WriteLine(ExitMain...); } publicvoidFunc1() { Console.WriteLine(EnterFunc1...); try { Console.WriteLine(Enteringtryblock...); Func2(); Console.WriteLine(Exitingtryblock...); } catch
{ Console.WriteLine(Exceptioncaughtandhandled.); } Console.WriteLine(ExitFunc1...);
----------------------------------------------------------------------------Kt qu:
Enter Main... Enter Func1... Entering try block... Enter Func2... Exception caught and handled. Exit Func1... Exit Main...
----------------------------------------------------------------------------Lc ny ngoi l khng c x l bn trong hm Func2(), m n c x l bn trong hm Func1(). Khi hm Func2() c gi, n in cu lnh thng bo vo hm ri pht sinh mt ngoi l. Vic thc hin chng trnh b ngng, CLR tm kim phn x l ngoi l, nhng trong hm ny khng c v CLR vo stack ly hm gi trong trng hp ny l Func1(). Cu lnh catchs c gi, v vic thc thi tip tc thc hin bnh thng sau cu lnh catch. Hy chc chn rng chng ta hiu r ti sao cu lnh Exiting try block v Exit Func2 khng c in ra. Chng ta c th dng cch c kim tra vic ny bng cch dng chng trnh debug cho chng trnh chy tng bc tm hiu r hn. To mt khi catchxc nh: Cho n by gi chng ta ch dng khi catchtng qut, tc l vi bt c ngoi l no cng c. Tuy nhin chng ta c th to ra khi catch xc nh x l ch mt vi cc ngoi l ch khng phi ton b ngoi l, da trn kiu ca ngoi l pht sinh. V d 13.4 minh ha cch xc nh loi ngoi l m chng ta x l. V d13.4: Xc nh ngoi l bt. ----------------------------------------------------------------------------namespaceProgramming_CSharp {
usingSystem; publicclassTest
{ publicstaticvoidMain() { Testt=newTest(); t.TestFunc(); } //tathchiahaiphnxlngoilringpublic voidTestFunc() { try { doublea=5; doubleb=0; Console.WriteLine({0}/{1}={2},a,b,DoDivide(a,b)); } catch(System.DivideByZeroException) { Console.WriteLine(DivideByZeroExceptioncaught!); } catch(System.ArithmeticException) { Console.WriteLine(ArithmeticExceptioncaught!); } catch { Console.WriteLine(Unknownexceptioncaught); } } //thchinphpchiahpl publicdoubleDoDivide(doublea,doubleb) { if(b==0) thrownewSystem.DivideByZeroException(); if(a==0) thrownewSystem.ArithmeticException(); return a/b; } }
----------------------------------------------------------------------------Kt qu:
DivideByZeroException caught!
----------------------------------------------------------------------------Trong v d ny, phng thc DoDivide() s khng cho php chng ta chia cho zero bi mt s khc, v cng khng cho php chia s zero. N s pht sinh mt i tng ca
DivideByzeroException nu
chia cho mt s khc l c php, nhng trong v d minh ha ca chng ta khng cho php thc hin vic ny, nu thc hin s pht sinh ra mt ngoi l
ArithmeticException.
Khi mt ngoi l c pht sinh, CLR s kim tra mi khi x l ngoi l theo th t v s ly khi u tin thch hp. Khi chng ta thc hin vi a=5v b=7th kt qu nh sau:
5/7=0.7142857142857143
Nh chng ta mong mun, khng c ngoi l c pht sinh. Tuy nhin, khi chng ta thay i gi tr ca a l 0, th kt qu l:
ArithmeticExceptioncaught!
Ngoi l c pht sinh, v CLR s kim tra ngoi l u tin: DivideByZeroException. Bi v khng ph hp, nn n s tip tc i tm v khi x l ArithmeticExceptionc chn. Cui cng, gi s chng ta thay i gi tr ca b l 0. Khi thc hin iu ny s dn n ngoi l DivideByZeroException. Ghi ch: Chng ta phi cn thn th t ca cu lnh catch, bi v
DivideByZeroException c
t ca cu lnh catch, th ngoi l DivideByZeroException s c ph hp vi khi x l ngoi l ArithmeticException. V vic x l ngoi l s khng bao gi c giao cho khi x l DivideByZeroException. Tht vy, nu th t ny c o, n s khng cho php bt c ngoi l no c x l bi khi x l ngoi l
DivideByZeroException.
thc hin bt c khi no v n s thng bo mt li bin dch. Chng ta c th phn phi cu lnh try/ catch, bng cch bt gi nhng ngoi l xc nh trong mt hm v nhiu ngoi l tng qut trong nhiu hm. Mc ch ca thc hin ny l a ra cc thit k ng. Gi s chng ta c phng thc A, phng thc ny gi mt phng thc khc tn l phng thc B, n lt mnh phng thc B gi phng thc C. V phng thc C tip tc gi phng thc D, cui cng phng thc D gi phng thc E. Phng thc
hn. Nu chng ta on trc phng thc E c th pht sinh ra ngoi l, chng ta c th to ra khi try/catch bt gi nhng ngoi l ny ch gn ni pht sinh ra ngoi l nht. Chng ta cng c th to ra nhiu khi x l ngoi l chung trong on chng trnh mc cao trong trng hp nhng ngoi l khng on trc c.
Cu lnh finally
Trong mt s tnh hung, vic pht sinh ngoi l v unwind stackc th to ra mt s vn . V d nh nu chng ta m mt tp tin hay trng hp khc l xc nhn mt ti nguyn, chng ta c th cn thit mt c hi ng mt tp tin hay l gii phng b nh m m chng trnh chim gi trc . Ghi ch: Trong ngn ng C#, vn ny t xy ra hn do c ch thu dn t ng ca C# ngn nga nhng ngoi l pht sinh t vic thiu b nh. Tuy nhin, c mt s hnh ng m chng ta cn phi quan tm bt c khi no mt ngoi l c pht sinh ra, nh vic ng mt tp tin, chng ta c hai chin lc la chn thc hin. Mt hng tip cn l a hnh ng nguy him vo trong khi try v sau thc hin vic ng tp tin trong c hai khi catch v try. Tuy nhin, iu ny gy ra on chng trnh khng c p do s dng trng lp lnh. Ngn ng C# cung cp mt s thay th tt hn trong khi finally. on chng trnh bn trong khi catch c m bo thc thi m khng quan tm n vic khi no th mt ngoi l c pht sinh. Phng thc TestFunc() trong v d 13.5 minh ha vic m mt tp tin nh l hnh ng u tin ca n, sau phng thc thc hin mt vi cc php ton ton hc, v sau l tp tin c ng. C th trong qu trnh m tp tin cho n khi ng tp tin chng trnh pht sinh ra mt ngoi l. Nu xut hin ngoi l, v khi tp tin vn cn m. Ngi pht trin bit rng khng c chuyn g xy ra, v cui ca phng thc ny th tp tin s c ng. Do chc nng ng tp tin c di chuyn vo trong khi finally, y n s c thc thi m khng cn quan tm n vic c pht sinh hay khng mt ngoi l trong chng trnh. V d 13.5: S dng khi finally. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTest { publicstaticvoidMain() { Testt=newTest(); t.TestFunc(); } //chia hais vx
lngoilnucpublicvoidTestFunc() { try
{ Console.WriteLine(Openfilehere); doublea=5; doubleb=0; Console.WriteLine({0}/{1}={2},a,b,DoDivide(a,b)); Console.WriteLine(Thislinemayornotprint); } catch(System.DivideByZeroException) { Console.WriteLine(DivideByZeroExceptioncaught!); } catch { Console.WriteLine(Unknownexceptioncaught); } finally { } } //thchinchianuhpl publicdoubleDoDivide(doublea,doubleb) { if(b==0) { thrownewSystem.DivideByZeroException(); } if(a==0) { thrownewSystem.ArithmeticException(); } returna/b; } } } Console.WriteLine(Closefilehere.);
----------------------------------------------------------------------------Kt qu:
Open file here
DivideByZeroException caught! Close file here. Kt qu trong trng hp b = 12 Open file here 5/ 12 = 0.416666666666 Close file here
----------------------------------------------------------------------------Trong v d ny mt khi catchc loi b v thm vo khi finally. Bt c khi mt ngoi l c c pht sinh ra hay khng th khi lnh bn trong finallycng c thc thi. Do vy nn trong c hai trng hp ta cng thy xut hin thng ip Close file here.
cu lnh
li. Mt thng tin stackcung cp hng lot cc cuc gi stackca phng thc gi m dn n nhng ngoi l c pht sinh. V d 13.6: Lm vic vi i tng ngoi l. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; publicclassTest { publicstaticvoidMain() { Testt=newTest();
t.TestFunc(); } //chiahaisvxlngoil
catch(System.DivideByZeroExceptione) { Console.WriteLine(\nDivideByZeroException!Msg:{0},e.Message); Console.WriteLine(\nHelpLink:{0},e.HelpLink);Console.WriteLine(\nHeresa stacktrace:{0}\n,e.StackTrace); } catch { Console.WriteLine(Unknownexceptioncaught); } } //thchinphpchiahpl publicdoubleDoDivide(doublea,doubleb) { if(b==0) { DivideByZeroExceptione=newDivideByZeroException(); e.HelpLink=http:/ ww. munc .n; /w h c .eduv throwe; } if(a==0) { thrownewArithmeticException(); } returna/b; }
} }
----------------------------------------------------------------------------Kt qu:
Open file here DivideByZeroExceptin Msg: Attempted to divide by zero HelpLink: http://www.hcmuns.edu.vn Heres a stack trace: at Programming_CSharp.Test.DoDivide(Double c, Double b) in c:\...exception06.cs: line 56 at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22. Close file here
----------------------------------------------------------------------------Trong on kt qu trn, danh sch trace ca stack c hin th theo th t ngc li th t gi. N hin th mt li trong phng thc DoDivde(), phng thc ny c gi t phng thc TestFunc(). Khi cc phng thc gi lng nhau nhiu cp, thng tin
stack c
Trc khi pht sinh ra ngoi l, chng ta thit lp thuc tnh HelpLinknh sau:
e.HelpLink=ttp:// w. munc d v h w h w c .eu.n;
Vic lm ny cho php chng ta cung cp nhng thng tin hu ch cho ngi s dng. Thm vo thng tin stack cng c a ra bng cch s dng thuc tnh StackTrace ca i tng ngoi l:
Console.WriteLine(\nHeresastacktrace:{0}\n,e.StackTrace);
atProgramming_CSharp.Test.DoDivide(Doublec,Doubleb)
inc:\...exception06.cs:line56 atProgramming_CSharp.Test.TestFunc()in...exception06.cs:line22.
Lu rng, phn ng dn c vit tt, do kt qu ca bn c th hi khc mt t. Bng 13.1 sau m t mt s cc lp ngoi l chung c khai bo bn trong namespace
System.
Tn ngoi l
MethodAccessException ArgumentException ArgumentNullException ArithmeticException ArrayTypeMismatchException DivideByZeroException FormatException IndexOutOfRangeException
CC LP NGOI L M t Li truy cp, do truy cp n thnh vin hay phng thc khng c truy cp Li tham s i mc i mc Null, phng thc c truyn i mc
nullkhng c chp nhn ton Li lin quan n cc php
Kiu mng khng hp, khi c lu tr kiu khng thch hpzero mng Li chia vo nh dng khng chnh xc mt i mc no Ch s truy cp mng khng hp l, dng nh hn ch s nh nht hay ln hn ch s ln nht ca Php gn khng hp l Multicast khng c h tr, do vic kt hp hai delegate khng nghn, s khng hp l Khng phi s hu Phng thc khng h tr, khi gi mt phng thc khngutn tkhng hp lp. Tham chi nulli bn trong l. Out of memory Li trn php ton Trn stack Kiu khi to sai, khi b khi dng tnh c li.
To ring cc ngoi l
CLR cung cp nhng kiu d liu ngoi l c bn, trong v d trc chng ta to
mt vi cc kiu ngoi l ring. Thng thng chng ta cn thit phi cung cp cc thng tin m rng cho khi catch khi mt ngoi l c pht sinh. Tuy nhin, c nhng lc chng ta
mun cung cp nhiu thng tin m rng hay l cc kh nng c bit cn thit trong ngoi l m chng ta to ra. Chng ta d dng to ra cc ngoi l ring, hay cn gi l cc ngoi l ty chn (custom exception), iu bt buc vi cc ngoi l ny l chng phi c dn xut t System.ApplicationException. V d 13.7 sau minh ha vic to mt ngoi l ring. V d: To mt ngoi l ring.
namespace Programming_CSharp { usingSystem; //tongoilring publicclassMyCustomException:System.ApplicationException { publicMyCustomException(stringmessage):base(message) { } } publicclassTest { publicstaticvoidMain() { Testt=newTest(); t.TestFunc(); } //chiahaisvxlngoil publicvoidTestFunc() { try { Console.WriteLine(Openfilehere); doublea=0; doubleb=5; Console.WriteLine({0}/{1}={2},a,b,DoDivide(a,b)); } Console.WriteLine(Thislinemayornotprint);
catch(System.DivideByZeroExceptione) { Console.WriteLine(\nDivideByZeroException!Msg:{0},e.Message);
Console.WriteLine(\nHelpLink:{0},e.HelpLink); } catch(MyCustomExceptione) { Console.WriteLine(\nMyCustomException!Msg:{0},e.Message); Console.WriteLine(\nHelpLink:{0},e.HelpLink); } catch { Console.WriteLine(Unknownexcepitoncaught); } finally { Console.WriteLine(Closefilehere.); } } //thchinphpchiahpl publicdoubleDoDivide(doublea,doubleb) { if(b==0) { DivideByZeroExceptione=newDivideByZeroException(); e.HelpLink=ttp:// w. munc d v h w h w c .eu.n; throwe; } if(a==0) { MyCustomException divisor); e.HelpLink=ttp:// w. muns d v h w h w c .eu.n; } throwe; e=newMyCustomException(Canthavezero
returna/b; } }
-----------------------------------------------------------------------------
Lp MyCustomException c dn xut t System.ApplicationException v lp ny khng c thc thi hay khai bo g ngoi mt hm khi dng. Hm khi dng ny ly tham s l mt chui v truyn cho lp c s. Trong trng hp ny, li ch ca vic to ra ngoi l l lm ni bt iu m chung trnh mun minh ha, tc l khng cho php s chia l zero. S dng ngoi l ArithmeticException th tt hn l ngoi l chng ta to ra. Nhng n c th lm nhm ln cho nhng ngi lp trnh khc v php chia vi s chia l zero khng phi l li s hc.
publicstaticvoidMain() { Testt=newTest();
t.TestFunc(); } //chiahaisvxlngoil publicvoidTestFunc() { try { DangerousFunc1(); } catch(MyCustomExceptione) { Console.WriteLine(\n{0},e.Message); Console.WriteLine(Retrievingexceptionhistory...); Exceptioninner=e.InnerException; while(inner!=null) { Console.WriteLine({0},inner.Message); inner=inner.InnerException; } } } publicvoidDangerousFunc1() { try { DangerousFunc2(); } catch(System.Exceptione) { MyCustomExceptionex=new MyCustomException(E3CustomExceptionSituation,e); throwex; } }
publicvoidDangerousFunc2() { try {
DangerousFunc3(); } catch(System.DivideByZeroExceptione) { Exceptionex=newException(E2Func2caughtdividebyzero,e); throwex; } } publicvoidDangerousFunc3() { try { DangerousFunc4(); } catch(System.ArithmeticException) { throw; } catch(System.Exception) { Console.WriteLine(Exceptionhandledhere.); } } publicvoidDangerousFunc4() { thrownewDivideByZeroException(E1DivideByZeroException); } } }
----------------------------------------------------------------------------Kt qu:
E3 Custom Exception Situation! Retrieving exception history... E2 - Func2 caught divide by zero E1 DivideByZeroException
-----------------------------------------------------------------------------
hiu r hn ta c th dng trnh debugger chy tng bc chng trnh khi ta s hiu r tng bc thc thi cng nh vic pht sinh cc ngoi l.
cng DangerousFunc3() gi DangerousFunc4(). Tt c vic gi ny iu nm trong khi try. Cui cng, DangerousFunc4() pht sinh ra ngoi l DivideByzeroException. Ngoi l ny bnh thng c cha thng ip bn trong n, nhng y chng ta t do dng thng ip mi. d theo di chng ta a vo cc chui xc nhn tun t cc s kin din ra. Ngoi l c pht sinh trong DangerousFunc4() v n c bt trong khi catchtrong hm
DangerousFunc3(). Exception (
C php thc hin pht sinh li cng mt ngoi l m khng c bt c b sung hay hiu chnh no l : throw. Do vy ngoi l c pht sinh cho DangerousFunc2(), khi catch trong DangerousFunc2() thc hin mt vi hnh ng v tip tc pht sinh mt ngoi l c kiu mi. Trong hm khi dng ca ngoi l mi, DangerousFunc2() truyn mt chui thng ip mi (E2 - Func2 caught divide by zero) v ngoi l ban u. Do vy ngoi l ban u (E1) tr thnh ngoi l bn trong ca ngoi l mi (E2). Sau hm DangerousFunc2() pht sinh ngoi l ny (E2) cho hm DangerousFunc1().
DangerousFunc1()
kiu l MyCustomException, truyn vo hm khi dng ca ngoi l mi mt chui mi (E3 Custom Exception Situation!) v ngoi l c bt gi (E2). Chng ta nn nh rng ngoi l c bt gi l ngoi l c cha ngoi l DivideByZeroException(E1) bn trong n. Ti thi im ny, chng ta c mt ngoi l kiu MyCustomException(E3), ngoi l ny cha bn trong mt ngoi l kiu Exception (E2), v n lt n cha mt ngoi l kiu DivideByZeroException(E1) bn trong. Sau cng ngoi l c pht sinh cho hm
TestFunc;
Console.WriteLine({0},inner.Message); inner=inner.InnerException; }
hi
v tr li
Cu hi 1: Vic s dng catch khng c tham s c v nh c nhiu sc mnh do chng bt gia tt c cc ngoi l. Ti sao chng ta khng lun lun s dng cu lnh catch khng c tham s bt cc li? Tr li 1: Mc d s dng catch duy nht c rt nhiu sc mnh, nhng n cng lm mt rt nhiu thng tin quan trng v ngoi l c pht sinh. Khi chng ta s khng bit chnh xc loi ngoi l xy ra v kh c th bo tr cng nh khc phc nhng ngoi l sau ny. V pha ngi dng cng vy. Nu chng trnh gp ngoi l m khng c thng bo r rng cho ngui dng th c th lm cho h hoang mang, v c th li cho chng trnh ca chng ta khng tt ngay c nhng li khng phi do ta. V d nh li ht ti nguyn b nh do ngi dng s dng qu nhiu chng trnh hot ng cng lc. Tm li l chng ta nn s dng catch vi nhng tham s chi tit thc hin tt vic qun l cc ngoi l c pht sinh. Cuhi 2: C phi tt c nhng ngoi l c i x mt cch bnh ng? Tr li 2: Khng phi, c hai loi ngoi l, ngoi l h thng v ngoi l ca chng trnh ng dng. Ngoi l ca chng trnh ng dng th s khng kt thc chng trnh. Cn ngoi l h thng th s kt thc chng trnh. Ni chung l nhng ngoi l xut hin trc y. Hin nay th ngi ta chia ra nhiu mc ngoi l v ty theo tng mc ca ngoi l m chng trnh ca chng ta s c nhn nhng ng x khc nhau. bit thm chi tit chng ta c th c thm trong ti liu .NET Framework v x l ngoi l. Cuhi 3: Nh cu tr li bn trn ti sao ti phi tm hiu nhiu v cc ngoi l v cch thc x l cc ngoi l khi chng c pht sinh? Tr li 3: Vic xy dng mt chng trnh ng dng l ht sc phc tp, chng trnh lun tim n nhng yu t khng n nh v c th pht sinh cc ngoi l dn n nhng li khng mong mun. Vic thc hin bt gi cc ngoi l l ht sc cn thit trong chng trnh, n cho php chng ta xy dng c chng trnh hon thin hn v x l cc thng ip ngoi l tt hn. Tm hiu nhng ngoi l em
n cho chng ta nhiu kinh nghim trong vic xy dng cc chng trnh phc tp hn.
Cu hi thm
Cuhi 1: Hy cho bit cc t kha c s dng x l ngoi l?
Cuhi 2: Phn bit gia li v ngoi l? Cu hi 3: Khi thc hin vic bt gi cc ngoi l. Nu c nhiu mc bt gi ngoi l th chng ta s thc hin mc no. T chi tit n tng qut, hay t tng qut n chi tit? Cuhi 4: ngha ca t kha finally trong vic x l ngoi l? Cuhi 5: Cu lnh no c dng pht sinh ngoi l? Cu hi 6: Loi no sau y nn c x l theo ngoi l v loi no th nn c x l bi cc m lnh thng thng? a. Gi tr nhp vo ca ngi dng khng nm trong mc cho php. b. Tp tin khng c vit m thc hin vit. c. i mc truyn vo cho phng thc cha gi tr khng hp l. d. i mc truyn vo cho phng thc cha kiu khng hp l. Cuhi 7: Nguyn nhn no dn n pht sinh ngoi l? Cuhi 8: Khi no th ngoi l xut hin? a. Trong khi to m ngun b. Trong khi bin dch c. Trong khi thc thi chng trnh d. Khi yu cu c a ta bi ngi dng cui. Cuhi 9: Khi no th khi lnh trong finally c thc hin? Cu hi 10: Trong namespace no chc cc lp lin quan n vic x l cc ngoi l? Hy cho bit mt s lp x l ngoi l quan trng trong namespace ny?
Bi tp
Bi tp 1: Hy vit on lnh thc hin vic bt gia ngoi l lin quan n cu lnh sau y:
Ketqua=Sothu1/Sothu2;
Bi tp 2: Chng trnh sau y c vn . Hy xc nh vn c th pht sinh ngoi l khi chy chng trnh. V vit li chng trnh hon chnh gm cc lnh x l ngoi l: ----------------------------------------------------------------------------usingSystem; publicclassTester { publicstaticvoidMain() { uintso1=0;int so2,so3;so2 =10;so3=0; //tnhgitrli
----------------------------------------------------------------------------Bi tp 3: Chng trnh sau y c th dn n ngoi l hay khng? Nu c th hy cho bit ngoi l c th c pht sinh. Hy vit li chng trnh hon chnh c x l cc ngoi l bng cch a ra thng ip v ngoi l c pht sinh. ----------------------------------------------------------------------------usingSystem;using System.IO;public classTester { publicstaticvoidMain() { stringfname="test3.txt"; stringbuffer; StreamReadersReader=File.OpenText(fname); while((buffer=sReader.ReadLine())!=null) { Console.WriteLine(buffer); } } }
----------------------------------------------------------------------------Bi tp 4: Hy xem li cc v d trong cc chng trc, v d no c th phi sinh ngoi l th hy thm cc on x l ngoi l cho v d .
389