You are on page 1of 740

NGN NG LP TRNH 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

Bin dch v MSIL................................................................................... 17 Ngn ng C#............................................................................................ 18

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

3. Nn tng ngn ng C#.................................................................................. 39


Kiu d liu..............................................................................................40
Kiu d liu xy dng sn....................................................................... 41 Chn kiu d liu..................................................................................... 42 Chuyn i kiu d liu........................................................................... 43

Bin v hng............................................................................................ 44
Gn gi tr xc nh cho bin................................................................... 45 Hng......................................................................................................... 46 2

Kiu lit k............................................................................................... 47

Ngn Ng Lp Trnh C#

Ngn Ng Lp Trnh C#

Kiu chui k t.......................................................................................50 nh danh.................................................................................................50

Biu thc.................................................................................................. 50 Khong trng............................................................................................51 Cu lnh................................................................................................... 51


Phn nhnh khng c iu kin............................................................... 52 Phn nhnh c iu kin.......................................................................... 53 Cu lnh lp............................................................................................. 60

Ton t..................................................................................................... 68 Namespace............................................................................................... 76 Cc ch dn bin dch............................................................................... 80 Cu hi & bi tp..................................................................................... 82

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

S dng cc thnh vin static...................................................................100


Gi phng thc static............................................................................. 101 S dng b khi dng static.................................................................... 101 S dng b khi dng private..................................................................102 S dng thuc tnh static..........................................................................102

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

5. K tha a hnh.......................................................................................... 125


c bit ha v tng qut ha.................................................................. 126 S k tha................................................................................................ 129
Thc thi k tha....................................................................................... 129 Gi phng thc khi dng ca lp c s...............................................131 Gi phng thc ca lp c s................................................................ 132 4

Ngn Ng Lp Trnh C#

iu khin truy xut.................................................................................132

a hnh..................................................................................................... 133
Kiu a hnh............................................................................................. 133 Phng thc a hnh................................................................................ 133 T kha new v override......................................................................... 137

Lp tru tng......................................................................................... 139


Gc ca tt c cc lp- lp Object........................................................... 142

Boxing v Unboxing d liu.................................................................... 144


Boxing d liu ngm nh........................................................................144 Unboxing phi thc hin tng minh...................................................... 145

Cc lp lng nhau.................................................................................... 147 Cu hi & bi tp..................................................................................... 149

6. Np chng ton t.......................................................................................... 153


S dng t kha operator......................................................................... 153 H tr ngn ng .NET khc.....................................................................154 S dng ton t........................................................................................ 154 Ton t so snh bng............................................................................... 156 Ton t chuyn i...................................................................................157 Cu hi & bi tp..................................................................................... 163

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

Cu hi & bi tp..................................................................................... 172

8. Thc thi giao din.......................................................................................... 176


Thc thi giao din.................................................................................... 177
Thc thi nhiu giao din.......................................................................... 180 M rng giao din.................................................................................... 181 Kt hp cc giao din...............................................................................181

Truy cp phng thc giao din.............................................................. 187


Gn i tng cho giao din.................................................................... 187 Ton t is................................................................................................. 188 Ton t as.................................................................................................190 Giao din i lp vi tru tng..............................................................192

Thc thi ph quyt giao din................................................................... 193 Thc thi giao din tng minh.................................................................197
5

Ngn Ng Lp Trnh C#

La chn th hin phng thc giao din................................................200 n thnh vin........................................................................................... 200

Cu hi & bi tp..................................................................................... 207

9. Mng, ch mc, v tp hp......................................................................... 211


Mng........................................................................................................ 212
Khai bo mng......................................................................................... 213 Gi tr mc nh....................................................................................... 214 Truy cp cc thnh phn trong mng....................................................... 214 Khi to thnh phn trong mng..............................................................216 S dng t kha params...........................................................................216

Cu lnh foreach...................................................................................... 218 Mng a chiu.......................................................................................... 220


Mng a chiu cng kch thc............................................................... 220 Mng a chiu c kch thc khc nhau..................................................224 Chuyn i mng..................................................................................... 227

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

10. X l chui..................................................................................................... 275


Lp i tng string................................................................................ 276
To mt chui.......................................................................................... 276 To mt chui dng phng thc ToString.............................................277 Thao tc trn chui...................................................................................278 Tm mt chui con................................................................................... 285 6

Ngn Ng Lp Trnh C#

Chia chui................................................................................................ 286 Thao tc trn chui dng StringBuilder................................................... 288

Cc biu thc quy tc............................................................................... 290


S dng biu thc quy tc qua lp Regex................................................291 S dng Regex tm tp hp................................................................. 294 S dng Regex gom nhm.................................................................. 295 S dng CaptureCollection...................................................................... 298

Cu hi & bi tp..................................................................................... 301

11. C ch y quyn v s kin...................................................................... 303


y quyn.................................................................................................. 304
S dng y quyn xc nhn phng thc lc thc thi............................. 304 y quyn tnh........................................................................................... 314 Dng y quyn nh thuc tnh................................................................. 315 Thit lp th t thi hnh vi mng y quyn........................................... 316 Multicasting............................................................................................. 320

S kin..................................................................................................... 324
C ch publishing- subscribing................................................................324 S kin v y quyn................................................................................. 325

Cu hi & bi tp..................................................................................... 333

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

13. X l ngoi l................................................................................................. 364


Pht sinh v bt gi ngoi l.................................................................... 365
Cu lnh throw......................................................................................... 365 Cu lnh catch.......................................................................................... 367 Cu lnh finally........................................................................................ 373

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.

Kt qu ca chng trnh xut ra mn hnh console dng font Courier New-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

Bin dch v MSIL Ngn ng C#

Tnh hnh trc khi MS.NET ra i


Trong lnh vc cng ngh thng tin ca th gii ngy nay, vi s pht trin lin tc v a dng nht l phn mm, cc h iu hnh, cc mi trng pht trin, cc ng dng lin tc ra i. Tuy nhin, i khi vic pht trin khng ng nht v nht l do li ch khc nhau ca cc cng ty phn mm ln lm nh hng n nhng ngi xy dng phn mm. Cch y vi nm Java c Sun vit ra, c sc mnh ng k, n hng ti vic chy trn nhiu h iu hnh khc nhau, c lp vi b x l (Intel, Risc,). c bit l Java rt thch hp cho vic vit cc ng dng trn Internet. Tuy nhin, Java li c hn ch v mt tc v trn thc t vn cha thnh hnh. Mc d Sun Corporation v IBM c y mnh Java, nhng Microsoft dng ASP lm gim kh nng nh hng ca Java. lp trnh trn Web, lu nay ngi ta vn dng CGI-Perl v gn y nht l PHP, mt ngn ng ging nh Perl nhng tc chy nhanh hn. Ta c th trin khai Perl trn Unix/Linux hay MS Windows. Tuy nhin c nhiu ngi khng thch dng do bn thn ngn ng hay cc qui c khc thng v Perl khng c pht trin thng nht, 9
Microsoft .NET

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.

Kin trc .NET Framework


.NET Framework l mt platform mi lm n gin vic pht trin ng dng trong mi trng phn tn ca Internet. .NET Framework c thit k y p ng theo quan im sau: cung cp mt mi trng lp trnh hng i tng vng chc, trong m ngun i tng c lu tr v thc thi mt cch cc b. Thc thi cc b nhng c phn tn trn Internet, hoc thc thi t xa. cung cp mt mi trng thc thi m ngun m ti thiu c vic ng gi phn mm v s tranh chp v phin bn. cung cp mt mi trng thc thi m ngun m m bo vic thc thi an ton m ngun, bao gm c vic m ngun c to bi hng th ba hay bt c hng no m tun th theo kin trc .NET. cung cp mt mi trng thc thi m ngun m loi b c nhng li thc hin cc script hay mi trng thng dch. lm cho nhng ngi pht trin c kinh nghim vng chc c th nm vng nhiu kiu ng dng khc nhau. Nh l t nhng ng dng trn nn Windows n nhng ng dng da trn web. 15
Microsoft .NET

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

Hnh 1.1: M t cc thnh phn trong .NET Framework.

Ngn Ng Lp Trnh C#

17
Microsoft .NET

Common Language Runtime (CLR)


Nh cp th CLR thc hin qun l b nh, qun l thc thi tiu trnh, thc thi m ngun, xc nhn m ngun an ton, bin bch v cc dch v h thng khc. Nhng c tnh trn l nn tng c bn cho nhng m ngun c qun l chy trn CLR. Do ch trng n bo mt, nhng thnh phn c qun l c cp nhng mc quyn hn khc nhau, ph thuc vo nhiu yu t nguyn thy ca chng nh: lin quan n Internet, h thng mng trong nh my, hay mt my tnh cc b. iu ny c ngha rng, mt thnh phn c qun l c th c hay khng c quyn thc hin mt thao tc truy cp tp tin, thao tc truy cp registry, hay cc chc nng nhy cm khc. CLR thc y vic m ngun thc hin vic truy cp c bo mt. V d, ngi s dng gii hn rng vic thc thi nhng vo trong mt trang web c th chy c hot hnh trn mn hnh hay ht mt bn nhc, nhng khng th truy cp c d liu ring t, tp tin h thng, hay truy cp mng. Do , c tnh bo mt ca CLR cho php nhng phn mm ng gi trn Inernet c nhiu c tnh m khng nh hng n vic bo mt h thng. CLR cn thc y cho m ngun c thc thi mnh m hn bng vic thc thi m ngun chnh xc v s xc nhn m ngun. Nn tng ca vic thc hin ny l Common Type System (CTS). CTS m bo rng nhng m ngun c qun l th c t m t (self- describing). S khc nhau gia Microsoft v cc trnh bin dch ngn ng ca hng th ba l vic to ra cc m ngun c qun l c th thch hp vi CTS. iu ny th m ngun c qun l c th s dng nhng kiu c qun l khc v nhng th hin, trong khi thc y nghim ngt vic s dng kiu d liu chnh xc v an ton. Thm vo , mi trng c qun l ca runtime s thc hin vic t ng x l layout ca i tng v qun l nhng tham chiu n i tng, gii phng chng khi chng khng cn c s dng na. Vic qun l b nh t ng ny cn gii quyt hai li chung ca ng dng: thiu b nh v tham chiu b nh khng hp l. Trong khi runtime c thit k cho nhng phn mm ca tng lai, n cng h tr cho phn mm ngy nay v trc y. Kh nng hot ng qua li gia m ngun c qun l v m ngun khng c qun l cho php ngi pht trin tip tc s dng nhng thnh phn cn thit ca COM v DLL. Rutime c thit k ci tin hiu sut thc hin. Mc d CLR cung cp nhiu cc tiu chun dch v runtime, nhng m ngun c qun l khng bao gi c dch. C mt c tnh gi l Just-in-Time (JIT) bin dch tt c nhng m ngun c qun l vo trong ngn ng my ca h thng vo lc m n c thc thi. Khi , trnh

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.

Th vin lp .NET Framework


Th vin lp .NET Framework l mt tp hp nhng kiu d liu c dng li v c kt hp cht ch vi Common Language Runtime. Th vin lp l hng i tng cung cp nhng kiu d liu m m ngun c qun l ca chng ta c th dn xut. iu ny khng ch lm cho nhng kiu d liu ca .NET Framework d s dng m cn lm gim thi gian lin quan n vic hc c tnh mi ca .NET Framework. Thm vo , cc thnh phn ca cc hng th ba c th tch hp vi nhng lp trong .NET Framework. Cng nh mong i ca ngi pht trin vi th vin lp hng i tng, kiu d liu . NET Framework cho php ngi pht trin thit lp nhiu mc thng dng ca vic lp trnh, bao gm cc nhim v nh: qun l chui, thu thp hay chn lc d liu, kt ni vi c c d liu, v truy cp tp tin. Ngoi nhng nhim v thng dng trn. Th vin lp cn a vo nhng kiu d liu h tr cho nhng kch bn pht trin chuyn bit khc. V d ngi pht trin c th s dng .NET Framework pht trin nhng kiu ng dng v dch v nh sau: ng dng Console ng dng giao din GUI trn Windows (Windows Forms) ng dng ASP.NET Dch v XML Web Dch v Windows Trong nhng lp Windows Forms cung cp mt tp hp ln cc kiu d liu nhm lm n gin vic pht trin cc ng dng GUI chy trn Windows. Cn nu nh vit cc ng dng ASP.NET th c th s dng cc lp Web Forms trong th vin .NET Framework.

Pht trin ng dng Client


Nhng ng dng client cng gn vi nhng ng dng kiu truyn thng c lp trnh da trn Windows. y l nhng kiu ng dng hin th nhng ca s hay nhng form trn desktop cho php ngi dng thc hin mt thao tc hay nhim v no . Nhng ng dng client bao gm nhng ng dng nh x l vn bn, x l bng tnh, nhng ng dng trong lnh vc thng mi nh cng c nhp liu, cng c to bo co...Nhng ng dng client ny thng s dng nhng ca s, menu, toolbar, button hay cc thnh phn GUI khc, v chng thng truy cp cc ti nguyn cc b nh l cc tp tin h thng, cc thit b ngoi vi nh my in. Mt loi ng dng client khc vi ng dng truyn thng nh trn l ActiveX control (hin nay n c thay th bi cc Windows Form control) c nhng vo cc

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

Bin dch v MSIL


Trong .NET Framework, chng trnh khng c bin dch vo cc tp tin thc thi m thay vo chng c bin dch vo nhng tp tin trung gian gi l Microsoft Intermediate Language (MSIL). Nhng tp tin MSIL c to ra t C# cng tng t nh cc tp tin MSIL c to ra t nhng ngn ng khc ca .NET, platform y khng cn bit ngn ng ca m ngun. iu quan trng chnh yu ca CLR l chung (common), cng mt runtime h tr pht trin trong C# cng nh trong VB.NET. M ngun C# c bin dch vo MSIL khi chng ta build project. M MSIL ny c lu vo trong mt tp tin trn a. Khi chng ta chy chng trnh, th MSIL c bin dch mt ln na, s dng trnh bin dch Just-In-Time (JIT). Kt qu l m my c thc thi bi b x l ca my. Trnh bin dch JIT tiu chun th thc hin theo yu cu. Khi mt phng thc c gi, trnh bin dch JIT phn tch MSIL v to ra sn phm m my c hiu qu cao, m ny c th chy rt nhanh. Trnh bin dch JIT thng minh nhn ra khi mt m c bin dch, do vy khi ng dng chy th vic bin dch ch xy ra khi cn thit, tc l ch bin dch m MSIL cha bin dch ra m my. Khi mt ng dng .NET thc hin, chng c xu hng l chy nhanh v nhanh hn na, cng nh l nhng m ngun c bin dch ri

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

Ti sao phi s dng ngn ng C#


Nhiu ngi tin rng khng cn thit c mt ngn ng lp trnh mi. Java, C+ +, Perl, Microsoft Visual Basic, v nhng ngn ng khc c ngh rng cung cp tt c nhng chc nng cn thit. Ngn ng C# l mt ngn ng c dn xut t C v C++, nhng n c to t nn tng pht trin hn. Microsoft bt u vi cng vic trong C v C++ v thm vo nhng c tnh mi lm cho ngn ng ny d s dng hn. Nhiu trong s nhng c tnh ny kh ging vi nhng c tnh c trong ngn ng Java. Khng dng li , Microsoft a ra mt s mc ch khi xy dng ngn ng ny. Nhng mc ch ny c c tm tt nh sau: C# l ngn ng n gin C# l ngn ng hin i C# l ngn ng hng i tng 27
Ngn Ng C#

C# l ngn ng mnh m v mm do

28
Ngn Ng C#

C# l ngn ng c t t kha C# l ngn ng hng module C# s tr nn ph bin

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#

C# l ngn ng hng i tng


Nhng c im chnh ca ngn ng hng i tng (Object-oriented language) l s ng gi (encapsulation), s k tha (inheritance), v a hnh (polymorphism). C# h tr tt

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 mnh m v cng mm do


Nh cp trc, vi ngn ng C# chng ta ch b gii hn chnh bi bn thn hay l tr tng tng ca chng ta. Ngn ng ny khng t nhng rng buc ln nhng vic c th lm. C# c s dng cho nhiu cc d n khc nhau nh l to ra ng dng x l vn bn, ng dng ha, bn tnh, hay thm ch nhng trnh bin dch cho cc ngn ng khc.

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

Bng 1.2: T kha ca ngn ng C#.

C# l ngn ng hng module


M ngun C# c th c vit trong nhng phn c gi l nhng lp, nhng lp ny cha cc phng thc thnh vin ca n. Nhng lp v nhng phng thc c th c s dng li trong ng dng hay cc chng trnh khc. Bng cch truyn cc mu 31
Ngn Ng C#

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...

Ngn ng C# v nhng ngn ng khc


Chng ta tng nghe n nhng ngn ng khc nh Visual Basic, C++ v Java. C l chng ta cng t hi s khc nhau gia ngn ng C# v nhng ngn ng . V cng t hi ti sao li chn ngn ng ny hc m khng chn mt trong nhng ngn ng kia. C rt nhiu l do v chng ta hy xem mt s s so snh gia ngn ng C# vi nhng ngn ng khc gip chng ta phn no tr li c nhng thc mc. Microsoft ni rng C# mang n sc mnh ca ngn ng C++ vi s d dng ca ngn ng Visual Basic. C th n khng d nh Visual Basic, nhng vi phin bn Visual Basic.NET (Version 7) th ngang nhau. Bi v chng c vit li t mt nn tng. Chng ta c th vit nhiu chng trnh vi t m ngun hn nu dng C#. Mc d C# loi b mt vi cc c tnh ca C++, nhng b li n trnh c nhng li m thng gp trong ngn ng C++. iu ny c th tit kim c hng gi hay thm ch hng ngy trong vic hon tt mt chng trnh. Chng ta s hiu nhiu v iu ny trong cc chng ca gio trnh. Mt iu quan trng khc vi C++ l m ngun C# khng i hi phi c tp tin header. Tt c m ngun c vit trong khai bo mt lp. Nh ni bn trn. .NET runtime trong C# thc hin vic thu gom b nh t ng. Do 33
Ngn Ng C#

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.

Cc bc chun b cho chng trnh


Thng thng, trong vic pht trin phn mm, ngi pht trin phi tun th theo quy trnh pht trin phn mm mt cch nghim ngt v quy trnh ny c chun ha. Tuy nhin trong phm vi ca chng ta l tm hiu mt ngn ng mi v vit nhng chng trnh nh th khng i hi kht khe vic thc hin theo quy trnh. Nhng gii quyt c nhng vn th chng ta cng cn phi thc hin ng theo cc bc sau. u tin l phi xc nh vn cn gii quyt. Nu khng bit r vn th ta khng th tm c phng php gii quyt. Sau khi xc nh c vn , th chng ta c th ngh ra cc k hoch thc hin. Sau khi c mt k hoch, th c th thc thi k hoch ny. Sau khi k hoch c thc thi, chng ta phi kim tra li kt qu xem vn c gii quyt xong cha. Logic ny thng c p dng trong nhiu lnh vc khc nhau, trong c lp trnh. Khi to mt chng trnh trong C# hay bt c ngn ng no, chng ta nn theo nhng bc tun t sau: Xc nh mc tiu ca chng trnh. Xc nh nhng phng php gii quyt vn . To mt chng trnh gii quyt vn . Thc thi chng trnh xem kt qu. 35
Ngn Ng C#

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.

Chng trnh C# n gin


bt u cho vic tm hiu ngn ng C# v to tin cho cc chng sau, chng u tin trnh by mt chng trnh C# n gin nht. V d 2.1 : Chng trnh C# u tin. ----------------------------------------------------------------------------classChaoMung { staticvoidMain() { //Xuatramanhinh System.Console.WriteLine(ChaoMung); } }

----------------------------------------------------------------------------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.

Lp, i tng v kiu d liu (type)


iu ct li ca lp trnh hng i tng l to ra cc kiu mi. Kiu l mt th 36
Ngn Ng C#

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

hn ch phm vi ca nhng t theo sau. N to ra mt

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); } }

----------------------------------------------------------------------------on chng trnh trn khi bin dch s c thng bo mt li nh sau:


errorCS0138:Ausingnamespacedirectivecanonlybeappliedtonamespace; System.Consoleisaclassnotanamespace.

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.

Phn bit ch thng v ch hoa


Cng ging nh C/C++, C# l ngn ng phn bit ch thng vi ch hoa, iu ny c ngha rng hai cu lnh writeLineth khc vi WriteLinev cng khc vi WRITELINE. ng tic l C# khng ging nh VB, mi trng pht trin C# s khng t sa cc li ny, nu chng ta vit hai ch vi cch khc nhau th chng ta c th a vo chng trnh g ri tm ra cc li ny. trch vic lnh ph thi gian v cng sc, ngi ta pht trin mt s qui c cho cch t tn bin, hng, hm, v nhiu nh danh khc na. Qui c trong gio trnh ny dng c 46
Ngn Ng C#

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.

Pht trin chng trnh minh ha


C ti thiu l hai cch son tho, bin dch v thc thi chng trnh trong cun sch ny: S dng mi trng pht trin tch hp (IDE) Visual Studio .NET S dng chng trnh son tho vn bn bt k nh Notepad ri dng bin dch dng lnh. Mc d chng ta c th pht trin phn mm bn ngoi Visual Studio .NET, IDE cung cp nhiu cc tin ch h tr cho ngi pht trin nh: h tr phn son tho m ngun nh canh l, mu sc, tch hp cc tp tin tr gip, cc c tnh intellisense,...Nhng iu quan trng nht l IDE phi c cng c debug mnh v mt s cng c tr gip pht trin ng dng khc. Trong cun sch ny gi s rng ngi c ang s dng Visual Studio .NET. Phn trnh ny s tp trung vo ngn ng v platform hn l cng c pht trin. Chng ta c th sao chp tt c nhng m ngun v d vo trong mt chng trnh son tho vn bn nh Notepad hay Emacs, lu chng di dng tp tin vn bn, v bin dch chng bng trnh bin dch dng lnh C#, chng trnh ny c phn phi cng .NET Framework SDK. Trong nhng chng cui v xy dng cc ng dng trn Windows v Web, chng ta s s dng cng c Visual Studio .NET to ra cc Windows Form v Web Form, tuy nhin chng ta cng c th vit bng tay trong Notepad nu chng ta quyt nh s dng cch lm bng tay thay v dng cng 48
Ngn Ng C#

c thit k.

S dng Notepad son tho

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.

Hnh 2.2: M ngun c son tho trong Notepad.

50
Ngn Ng C#

Hnh 2.3: Bin dch v thc thi chng trnh.

S dng Visual Studio .NET to chng trnh


to chng trnh cho mng trong IDE, la chn mc Visual Studio .NET trong menu Start hoc icon ca n trn desktop, sau khi khi ng xong chng trnh, chn tip chc nng File New
Project trong

menu. Chc nng ny s gi ca s New Project

(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.4: To ng dng C# console trong Visual Studio .NET.

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

v tr bt u ca chng ta. to chng trnh cho mng trong minh ha trn, ta

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#

{ staticvoidMain() { intx,y; for(x=0;x<10;x++,System.Console.Write(\n)); for(y=0;y<10;y++,System.Console.WriteLine({0},y)); } }

----------------------------------------------------------------------------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); } }

----------------------------------------------------------------------------Bi tp 7: Vit chng trnh xut ra bi th:


Ngn Ng C#

60

RmThngGing Rmxunlnglngtrngsoi, Sngxunnclnmutrithmxun.Gia dngbnbcvicqun Khuyavbtngttrngngnythuyn. HChMinh.

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

Biu thc Khong trng Cu lnh


Phn nhnh khng c iu kin Phn nhnh c iu kin Cu lnh lp

Ton t Namespace Cc ch dn bin dch Cu hi & bi tp

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.

Kiu d liu xy dng sn


Ngn ng C# a ra cc kiu d liu xy dng sn rt hu dng, ph hp vi mt ngn ng lp trnh hin i, mi kiu d liu c nh x n mt kiu d liu c h tr bi h thng xc nhn ngn ng chung (Common Language Specification: CLS) trong MS.NET. Vic nh x cc kiu d liu nguyn thu ca C# n cc kiu d liu ca .NET s m bo cc i tng c to ra trong C# c th c s dng ng thi vi cc i tng c to bi bt c ngn ng khc c bin dch bi .NET, nh VB.NET. Mi kiu d liu c mt s xc nhn v kch thc khng thay i, khng ging nh C++, int trong C# lun c kch thc l 4 byte bi v n c nh x t kiu
Int32 trong

. 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

Char Boolean Sbyte Int16 Unt16 Int32 Uint32 Single Double

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

Kiu s nguyn c du c gi tr trong khong : -9.223.370.036.854.775.808 n 9.223.372.036.854.775.807 S nguyn khng du t 0 n 0xffffffffffffffff

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.

Chn kiu d liu


Thng thng chn mt kiu d liu nguyn s dng nh short, inthay
long

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

mt cu trc d liu lu tr thng tin dng xp chng tc 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

khi chng ta khai bo r rng. gn mt s kiu floatth s phi c k t f theo

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

Du nhy n Du nhy kp Du cho K t null Alert

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.

Chuyn i cc kiu d liu


Nhng i tng ca mt kiu d liu ny c th c chuyn sang nhng i tng ca mt kiu d liu khc thng qua c ch chuyn i tng minh hay ngm nh. Chuyn i nhm nh c thc hin mt cch t ng, trnh bin dch s thc hin cng vic ny. Cn chuyn i tng minh din ra khi chng ta gn p mt gi tr cho kiu d liu khc. Vic chuyn i gi tr ngm nh c thc hin mt cch t ng v m bo l khng mt thng tin. V d, chng ta c th gn ngm nh mt s kiu short (2 byte) vo mt s kiu int (4 byte) mt cch ngm nh. Sau khi gn hon ton khng mt d liu v bt c gi tr no ca shortcng thuc v int:
shortx=10; inty=x;//chuyningmnh

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#

classMinhHoaC3 { staticvoidMain() { intbien1=9; System.Console.WriteLine(Saukhikhoitao:bien1={0},bien1); bien1=15; System.Console.WriteLine(Saukhigan:bien1={0},bien1); } }

----------------------------------------------------------------------------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;

Gi tr 100 l gi tr hng. Gi tr ca 100 lun l 100. Ta khng th gn gi tr khc cho 100 73 c.


Nn Tng Ngn Ng C#

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; } }

Khi trnh bin dch s pht sinh mt li sau:


error CS0131: The left-hand side of an assignment must be a variable, property or indexer.

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 }

Khi gi tr ca ThuNhatl 0, gi tr ca ThuHail 1, gi tr ca ThuBal 10 v gi tr ca


ThuTul

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;

Mt hng chui c to bng cch t cc chui trong du nhy i:


Xinchao

y l cch chung khi to mt chui k t vi gi tr hng:


stringchuoi=Xinchao

Kiu chui s c cp su trong chng 10.

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.

Lu l ton t gn (=) khng phi l ton t so snh. Do vy khi s dng ton t ny

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;

Khong trng (whitespace)


Trong ngn ng C#, nhng khong trng, khong tab v cc dng c xem nh l khong trng (whitespace), ging nh tn gi v ch xut hin nhng khong trng i din cho cc k t . C# s b qua tt c cc khong trng , do vy chng ta c th vit nh sau:
var1=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!);

mi khong trng gia hai ch Xin v chao u c i x bnh thng nh cc k 83


Nn Tng Ngn Ng C#

t khc trong chui.

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;

nhng khng ging 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,

v eachs c cp ti trong mc tip theo.

Sau y chng ta s xem xt hai loi lnh phn nhnh ph bin nht trong lp trnh C#.

Phn nhnh khng c iu kin


Phn nhnh khng c iu kin c th to ra bng hai cch: gi mt hm v dng t kho phn nhnh khng iu kin. Gi hm

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

c gi l mt li gi hm. Ti im ny lung chng trnh s r

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,

Vic trnh by cc t kha phn nhnh khng iu kin ny s c

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() {

intvar1=10; intvar2=20; if(var1>var2)

{ 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)

{ if(gioiTinh==false)//nu Console.WriteLine(Nucothekethon); else//nam

if(tuoi>19)//philnhn19tuoimickthn Console.WriteLine(Namcothekethon); } else//dacogiadinh Console.WriteLine(Khongthekethonnuadodakethon); } else//tuoi<19 Console.WriteLine(Khongdutuoikethon); } }

----------------------------------------------------------------------------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;

casemauLam: Console.WriteLine(Banchonmaulam); gotocasemauCham; casemauCham:

Console.WriteLine(Banchomaucham); gotocasemauTim; casemauTim: Console.WriteLine(Banchonmautim); gotocasemauLuc; default: Console.WriteLine(Bankhongchonmaunaohet); break; } Console.WriteLine(Xincamon!); } }

----------------------------------------------------------------------------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

Cu lnh casethc hin


casemauDo casemauCam casemauVang casemauLuc casemauLuc casemauLam casemauCham casemauTim

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

casemauLuc casemauCham casemauTim

mauTim

casemauLuc casemauTim casemauLuc

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

c thc hin v kt qu nh sau:

-----------------------------------------------------------------------------

Kt qu v d 3.9

Ban chon mau luc Xin cam on!

----------------------------------------------------------------------------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:

gi tr l mt chui, c th vit nh sau:

switch(chuoi1)

.... break; casemaucam:

... break; ... }

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

Console.WriteLine(i:{0},i);i++; if(i<10) gotolap; //nhyvnhnlap return0;

} }

-----------------------------------------------------------------------------

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

cha c kim tra. V d 3.12: Minh ho vic s dng vng lp do..while.

----------------------------------------------------------------------------usingSystem; publicclassUsingDoWhile { publicstaticintMain() { inti=11; do { Console.WriteLine(i:{0},i); i++; }while(i<10) return0; } }

----------------------------------------------------------------------------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.

C php s dng vng lp fornh sau:


for([phnkhito];[biuthciukin];[bclp]) <Culnhthchin>

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++)

{ if(i%10==0) { Console.WriteLine({0},i); } else { Console.Write({0},i); } } return0; } }

----------------------------------------------------------------------------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++) {

if(i%10==0) { Console.WriteLine({0},i); } else { Console.Write({0},i); } } //Lnhsausaidobinichckhaibobntrongvnglp Console.WriteLine(Ketquacuoicungcuai:{0},i); return0; } }

----------------------------------------------------------------------------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

cc lnh tip ngay sau vng lp.


Continuengng

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.

on chng trnh m phng h thng x l tn hiu giao thng n gin. Tn hiu

m phng l cc k t ch hoa hay s c nhp vo t bn phm, s dng hm ReadLine ca lp


Console

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 {

publicstaticintMain() { stringsignal=0;//Khitotnhiu //btuchutrnhxltnhiuwhile( signal!=X)

{ //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; } }

----------------------------------------------------------------------------Kt qu: sau khi nhp tun t cc tn hiu : 0, B, T


Nhap vao mot tin hieu: 0 Tin hieu nhan duoc: 0 Tat ca dieu tot! Nhap vao mot tin hieu: B Tin hieu nhan duoc: B

---bip bip bip

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

-----------------------------------------------------------------------------

Ton t tng v gim


Khi s dng cc bin s ta thng c thao tc l cng mt gi tr vo bin, tr i mt gi tr t bin , hay thc hin cc tnh ton thay i gi tr ca bin sau gn gi tr mi va tnh ton cho chnh bin . Tnh ton v gn tr li Gi s chng ta c mt bin tn Luong lu gi tr lng ca mt ngi, bin Luong ny c gi tr hin thi l 1.500.000, sau tng thm 200.000 ta c th vit nh sau:
Luong=Luong+200.000;

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

*=

/=

%=

Bng 3.4: M t cc php ton t gn.

Da trn cc php ton t gn trong bng ta c th thay th cc lnh tng gim lng nh sau:

Luong+=200.000; Luong*=2; Luong=100.000;

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++;

Console.WriteLine(Thuchientangsau:{0},{1},valueOne, valueTwo); valueOne=20;

valueTwo=++valueOne; Console.WriteLine(Thuchientangtruoc:{0},{1},valueOne, valueTwo); return0; } }

----------------------------------------------------------------------------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
== != > >= < <=

Biu thc so snh


value1==100 value1==50 value2!=100 value2!=90 value1>value2 value2>value1 value2>=50 value1<value2 value2<value1 value1<=value2

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)

Biu thc logic


(x==3)&&(y== (x==3)||(y==7) !(x==3)

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

cn thit xc nh gi tr ca biu thc cn li, tc l vi bt k gi tr no ca biu thc (y


==10)

th ton b biu thc iu kin ifvn sai.

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

Th t Tri Tri Tri Tri Tri

Php nhn Php cng Dch bit

*/% + <<>>

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
| && || ?: =*=/=%=+==<<=>>= &= ^=|=

Phi Tri Tri Tri Tri Tri Phi Phi

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;

intvalue2; int maxValue;

value1 = 10; value2=20; maxValue=value1>value2?value1:value2; Console.WriteLine(Giatrithunhat{0},giatrithuhai{1}, giatrilonnhat{2},value1,value2,maxValue); return0; } }

----------------------------------------------------------------------------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>

to mt namespace dng c php sau:


namespace<Tnnamespace> { <nhnghalpA> <nhnghalpB> ..... }

on v d 3.20 minh ha vic to mt namespace.

V d 3.20: To mt namespace. -----------------------------------------------------------------------------

namespaceMyLib { usingSystem; publicclassTester { publicstaticintMain() { for(inti=0;i<10;i++) { Console.WriteLine(i:{0},i); } return0; } } }

----------------------------------------------------------------------------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; } }

} }

----------------------------------------------------------------------------Lp Tester trong v d 3.21 c t trong namespace Demo do c th to mt lp


Testerkhc

bn ngoi namespace Demo hay bn ngoi namespace MyLib m khng c

bt c s tranh cp hay xung t no. truy cp lp Testerdng c php sau:


MyLib.Demo.Tester

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

//lpExample1nhnghaikhaibokhngcngmtkhi. namespaceMyLib.Demo1 { classExample2 { publicstaticvoidShow2() { Console.WriteLine(LopExample2); } } }

----------------------------------------------------------------------------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.

hm Mainca Demo2s c chng trnh thc hin, v trong hm Mainny

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

cng thuc mt namespace MyLib.Demo1, tuy nhin Example2 c khai bo

mt khi ring l bng cch s dng khai bo:


namespaceMyLib.Demo1 { classExample2 { .... } }

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.

Khng nh ngha nh danh


S dng ch th tin x l #undef xc nh trng thi ca mt nh danh l khng c nh ngha. Nh chng ta bit trnh tin x l s thc hin t trn xung di, do vy mt nh danh c khai bo bn trn vi ch th #define s c hiu qu n khi mt gi cu lnh #undefnh danh hay n cui chng trnh:
#defineDEBUG #ifDEBUG //oncodenycbindch #endif .... #undefDEBUG .... #ifDEBUG //oncodenykhngcbindch #endif ..... #if u

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 ....

Trong v d trn th ch th tin x l #if u tin s kim tra nh danh DEBUG, nu nh

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 }

Cuhi 23: Cho bit cc lnh phn nhnh trong C#?

Bi tp
Bi tp 1: Nhp vo, bin dch v chy chng trnh. Hy cho bit chng trnh lm iu g? -----------------------------------------------------------------------------

classBaiTap3_1 { publicstaticvoidMain() { intx=0; for(x=1;x<10;x++) { System.Console.Write({0:03},x); } } }

----------------------------------------------------------------------------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)

Bi tp6: Vit chng trnh hin ra trn mn hnh.

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

S dng cc thnh vin static


Gi phng thc static S dng b khi dng static S dng b khi dng private S dng thuc tnh static

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;

tuy nhin ta khng th vit c


int=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

hin v cc hnh vi ca chng nh: chng c th thm bi mc tin, sp xp,...

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,

cc phng thc hay hnh vi nh Add(),Remove(),Sort(),...

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();

Thuc tnh truy cp


Thuc tnh truy cp quyt nh kh nng cc phng thc ca lp bao gm vic cc phng thc ca lp khc c th nhn thy v s dng cc bin thnh vin hay nhng phng thc bn trong lp. Bng 4.1 tm tt cc thuc tnh truy cp ca mt lp trong C#. Thuc tnh
public

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

truy cp bi cc phng thc

ca lp A, cc phng thc ca lp dn xut ca A, v bt c lp

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

mc nh nn trong v d 4.1 ta khng khai bo thuc tnh truy cp cho 6 bin

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.

Tham s ca phng thc


Trong cc ngn ng lp trnh th tham s v i mc c xem l nh nhau, cng tng t khi ang ni v ngn ng hng i tng th ta gi mt hm l mt phng thc hay hnh vi. Tt c cc tn ny iu tng ng vi nhau. Mt phng thc c th ly bt k s lng tham s no, Cc tham s ny theo sau bi tn ca phng thc v c bao bc bn trong du ngoc trn (). Mi tham s phi khai bo km vi kiu d liu. v d ta c mt khai bo nh ngha mt phng thc c tn l
Method,

phng thc khng tr v gi tr no c (khai bo gi tr tr v l void), v c hai

tham s l mt kiu intv button:


voidMethod(intparam1,buttonparam2) { //... }

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

V d 4.2: Truyn tham s cho phng thc. -----------------------------------------------------------------------------

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

th t danh sch bin a vo.

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

s khng cha gi tr ca i tng ThoiGian, n ch cha a ch ca i tng c

to ra trn heap, do vy tch cha tham chiu n mt i tng m thi.

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

lp khai bo. Phng thc khi dng khng c gi tr tr v v c khai bo l


public.

Nu phng thc khi dng ny c truyn tham s th phi khai bo danh

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

gi trong hm Main()s hin th gi tr thi gian lc i tng c

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

c cung cp bi th vin System, lp ny cng cung cp cc bin thnh

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

vi thi gian hin hnh. Theo nh trn khi lnh :


System.DataTimecurrentTime=System.DateTime.Now();

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

cng tham chiu n mt i tng DateTime trong b nh. Nh vy

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

ch hon ton khng c mt i tng no c sao chp li.

173
Xy Dng Lp - i Tng

Khi to bin thnh vin


Cc bin thnh vin c th c khi to trc tip khi khai bo trong qu trnh khi to, thay v phi thc hin vic khi to cc bin trong b khi dng. thc hin vic khi to ny rt n gin l vic s dng php gn gi tr cho mt bin:
privateintGiay=30; //Khito

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

publicThoiGian(intYear,intMonth,intDate,intHour,intMinute) { Nam=Year; Thang=Month; Ngay=Date;

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

Hien tai: Thoi Gian:

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.

B khi dng sao chp


B khi dng sao chp thc hin vic to mt i tng mi bng cch sao chp tt c cc bin t mt i tng c v cng mt kiu d liu. V d chng ta mun a mt i tng ThoiGian vo b khi dng lp ThoiGian to mt i tng
ThoiGianmi

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; }

Khi ta c th sao chp t mt i tng ThoiGian hin hu nh sau:


ThoiGiant2=newThoiGian(t1);

Trong t1l i tng ThoiGian tn ti, sau khi lnh trn thc hin xong th i tng
t2c

to ra nh bn sao ca i tng t1.

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.

S dng cc thnh vin tnh (static member)


Nhng thuc tnh v phng thc trong mt lp c th l nhng thnh vin th hin (instance members) hay nhng thnh vin tnh (static members). Nhng thnh vin th hin hay thnh vin ca i tng lin quan n th hin ca mt kiu d liu. Trong khi thnh vin tnh c xem nh mt phn ca lp. Chng ta c th truy cp n thnh vin tnh ca mt lp thng qua tn lp c khai bo. V d chng ta c mt lp tn l Buttonv c hai th hin ca lp tn l btnUpdatev btnDelete. V gi s lp Buttonny c mt phng thc tnh l Show(). truy cp phng thc tnh ny ta vit :
Button.Show();

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.

Gi mt phng thc tnh


Nh chng ta bit phng thc Main() l mt phng thc tnh. Phng tnh c xem nh l phn hot ng ca lp hn l ca th hin mt lp. Chng cng khng cn c mt tham chiu thishay bt c th hin no tham chiu ti. Phng thc tnh khng th truy cp trc tip n cc thnh vin khng c tnh cht tnh (nonstatic). Nh vy Main() khng th gi mt phng thc khng tnh bn trong lp. Ta xem li on chng trnh minh ha trong v d 4.2:
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); }

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.

Sau khi to th c th thng qua i tng c ta c th gi c c phng thc


SomeMethod().

S dng b khi dng tnh


Nu mt lp khai bo mt b khi to tnh (static constructor), th c m bo rng phng thc khi dng tnh ny s c thc hin trc bt c th hin no ca lp c to ra. Ghi ch: Chng ta khng th iu khin chnh xc khi no th phng thc khi dng tnh ny c thc hin. Tuy nhin ta bit chc rng n s c thc hin sau khi chng trnh chy v trc bt k bin i tng no c to ra. Theo v d 4.4 ta c th thm mt b khi dng tnh cho lp ThoiGiannh sau:
staticThoiGian() { Ten=Thoigian; }

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;

Cui cng ta thm mt dng vo phng thc ThoiGianHienHanh()ca lp ThoiGian:


publicvoidThoiGianHienHanh() { System.Console.WriteLine(Ten:{0},Ten);System.Console.WriteLine(Thoi Gian:\t{0}/{1}/{2}{3}:{4}:{5}, Ngay,Thang,Nam,Gio,Phut,Giay); }

Sau khi thay i ta bin dch v chy chng trnh c kt qu sau:


Ten: Thoi Gian Thoi Gian: 5/6/2002 18:35:20

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

thc hin duy nht mt ln.

S dng b khi dng private


Nh ni ngn ng C# khng c phng thc ton cc v hng s ton cc. Do vy chng ta c th to ra nhng lp tin ch nh ch cha cc phng thc tnh. Cch thc hin ny lun c hai mt tt v khng tt. Nu chng ta to mt lp tin ch nh vy v khng mun bt c mt th hin no c to ra. ngn nga vic to bt c th hin ca lp ta to ra b khi dng khng c tham s v khng lm g c, tc l bn trong thn ca phng thc rng, v thm vo phng thc ny c nh du l private. Do khng c b khi dng public, nn khng th to ra bt c th hin no ca lp.

S dng cc thuc tnh tnh


Mt vn t ra l lm sao kim sot c s th hin ca mt lp c to ra khi thc hin chng trnh. V hon ton ta khng th to c bin ton cc lm cng vic m s th hin ca mt lp. Thng thng cc bin thnh vin tnh c dng m s th hin c c to ra ca mt lp. Cch s dng ny c p dng trong minh ha sau: V d 4.5: S dng thuc tnh tnh m s th hin. ----------------------------------------------------------------------------usingSystem; publicclassCat { publicCat() { instance++; } publicstaticvoidHowManyCats() { Console.WriteLine({0}cats,instance); } privatestaticintinstance=0; } publicclassTester { staticvoidMain() { Cat.HowManyCats();Cat

mun=newCat(); Cat.HowManyCats(); Catmuop=newCat();

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

tng bin instance ln mt n v.

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 }

Cng tng t nh vit :


Class1.Finalize() { //Thchinmtscngvic base.Finalize(); }

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.

Phng thc Dispose


Nh chng ta bit th vic gi mt phng thc kt thc Finalize trong C# l khng hp l, v phng thc ny dnh cho b thu dn thc hin. Nu chng ta x l cc ti nguyn khng kim sot nh x l cc handle ca tp tin v ta mun c ng hay gii phng nhanh chng bt c lc no, ta c thc thi giao din IDisposable, phn chi tit IDisposables 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(); }

Phng thc Close


Khi xy dng cc i tng, chng ta c mun cung cp cho ngi s dng phng thc
Close(),

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

c lin quan n x l tp tin. Ta c th xy dng phng thc Dispose() vi thuc tnh l


privatev

l gi thc hin phng thc Dispose().

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.

V d 4.6: S dng ch dn using. ----------------------------------------------------------------------------usingSystem.Drawing; classTester {

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.

Truyn tham chiu

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

vateintHour;private intMinute;privateint Second;

} 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

cc tham s truyn vo. Tc l ba tham s ny c truyn vo di dng

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.

Truyn tham chiu vi bin cha khi to


Ngn ng C# bt buc phi thc hin mt php gn cho bin trc khi s dng, do khi khai bo mt bin nh kiu c bn th trc khi c lnh no s dng cc bin ny th phi c lnh thc hin vic gn gi tr xc nh cho bin. Nh trong v d 4.7 trn, nu chng ta khng khi to bin theHour, theMinute, v bin theSecond trc khi truyn nh tham s vo phng thc GetTime() th trnh bin dch s bo li. Nu chng ta sa li on m ca v d 4.7 nh sau:
inttheHour;int theMinute; inttheSecond; t.GetTime(refinttheHour,refinttheMinute,refinttheSecond);

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; }

v cch gi mi phng thc GetTime()trong Main():


t.GetTime(outtheHour,outtheMinute,outtheSecond);

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.

Np chng phng thc


Thng thng khi xy dng cc lp, ta c mong mun l to ra nhiu hm c cng tn. Cng nh hu ht trong cc v d trc th cc lp iu c nhiu hn mt phng thc khi dng. Nh trong lp Time c cc phng thc khi dng nhn cc tham s khc nhau, nh tham s l i tng DateTime, hay tham s c th c ty chn thit lp cc gi tr ca cc bin thnh vin thng qua cc tham s nguyn. Tm li ta c th xy dng nhiu cc phng thc cng tn nhng nhn cc tham s khc nhau. Chc nng ny c gi l np chng phng thc. Mt k hiu (signature) ca mt phng thc c nh ngha nh tn ca phng thc cng vi danh sch tham s ca phng thc. Hai phng thc khc nhau khi k hiu ca chng khc l khc nhau tc l khc nhau khi tn phng thc khc nhau hay danh sch tham s khc nhau. Danh sch tham s c xem l khc nhau bi s lng cc tham s hoc l kiu d liu ca tham s. V d on m sau, phng thc th nht khc phng thc th hai do s lng tham s khc nhau. Phng thc th hai khc phng thc th ba do kiu d liu tham s khc nhau:
voidmyMethod(intp1);

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

ateintHour;private intMinute;privateint Second; }

publicclassTester { staticvoidMain() { System.DateTimecurrentTime=System.DateTime.Now;Timet1 =newTime(currentTime);t1.DisplayCurrentTime(); Timet2=newTime(2002,6,8,18,15,20); t2.DisplayCurrentTime(); } }

----------------------------------------------------------------------------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.

ng gi d liu vi thnh phn thuc tnh


Thuc tnh l khi nim cho php truy cp trng thi ca lp thay v thng qua truy cp trc tip cc bin thnh vin, n s c thay th bng vic thc thi truy cp thng qua phng thc ca lp. y tht s l mt iu l tng. Cc thnh phn bn ngoi (client) mun truy cp trng thi ca mt i tng v khng mun lm vic vi nhng phng thc. Tuy nhin, ngi thit k lp mun du trng thi bn trong ca lp m anh ta xy dng, v cung cp mt cch gin tip thng qua mt phng thc. Thuc tnh l mt c tnh mi c gii thiu trong ngn ng C#. c tnh ny cung cp kh nng bo v cc trng d liu bn trong mt lp bng vic c v vit chng thng qua thuc tnh. Trong ngn ng khc, iu ny c th c thc hin thng

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;

//Binthnhvinprivate privateintyear; privateintmonth; privateintdate;

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;

Truy cp ly d liu (get accessor)


Phn khai bo tng t nh mt phng thc ca lp dng tr v mt i tng c kiu d liu ca thuc tnh. Trong v d trn, b truy cp ly d liu get ca thuc tnh Hour cng tng t nh mt phng thc tr v mt gi tr int. N tr v gi tr ca bin thnh vin hourni m gi tr ca thuc tnh Hourlu tr:
get { returnhour; }

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.

B truy cp thit lp d liu ( set accessor)


B truy cp ny s thit lp mt gi tr mi cho thuc tnh v tng t nh mt phng thc tr v mt gi tr void. Khi nh ngha b truy cp thit lp d lu chng ta phi s dng t kha value i din cho tham s c truyn vo v c lu tr bi thuc tnh:
set { hour=value; }

Nh ni trc, do ta ang khai bo thuc tnh lu tr di dng bin thnh vin nn

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()

{ Console.WriteLine(Thisyear:{0}, RightNow.Year.ToString()); RightNow.Year=2003; Console.WriteLine(Thisyear:{0}, RightNow.Year.ToString()); } }

----------------------------------------------------------------------------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;

Khi ta phi b lnh gn bin thnh vin Year, v nu khng s b bo li:


//RightNow.Year=2003;//error

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

ngoi c th truy cp chng?

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.

Dng lnh no gy ra li? -----------------------------------------------------------------------------

classClass1 { publicstaticvoidGetNumber(refintx,refinty) { x=5; y=10; } publicstaticvoidMain() { inta=0,b=0; GetNumber(a,b); System.Console.WriteLine(a={0}\nb={1},a,b); } }

----------------------------------------------------------------------------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

Boxing v Unboxing d liu


Boxing thc hin ngm nh Unboxing phi thc hin tng minh

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.

c bit ha v tng qut ha


Lp v cc th hin ca lp tc i tng tuy khng tn ti trong cng mt khi, nhng chng tn ti trong mt mng li s ph thuc v quan h ln nhau. V d nh con ngi v x hi ng vt cng sng trong mt th gii c quan h loi vi nhau. Quan h l mt (is-a) l mt s c bit ha. Khi chng ta ni rng mo l mt loi ng vt c v, c ngha l chng ta ni rng mo l mt trng hp c bit ca loi ng vt c v. N c tt c cc c tnh ca bt c ng vt c v no (nh sinh ra con, c sa m v c lng...). Tuy nhin, mo c thm cc c tnh ring c xc nh trong h nh mo m cc h ng vt c v khc khng c c. Ch cng l loi ng vt c v, ch cng c tt c cc thuc tnh ca ng vt c v, v ring n cn c thm cc thuc tnh ring xc nh h loi ch m khc vi cc thuc tnh c bit ca loi khc v d nh mo chng hn. Quan h c bit ha v tng qut ha l hai mi quan h i ngu v phn cp vi nhau. Chng c quan h i ngu v c bit c xem nh l mt ngc li ca tng qut. Do , loi ch v mo l trng hp c bit ca ng vt c v. Ngc li ng vt c v l trng hp tng qut t cc loi ch v mo. Mi quan h l phn cp bi v chng ta to ra mt cy quan h, trong cc trng hp c bit l nhng nhnh ca trng hp tng qut. Trong cy phn cp ny nu di chuyn ln trn cng ta s c trng hp tng qut ha, v ngc li nu di chuyn xung ngc nhnh th ta c trng hp c bit ha. Ta c s phn cp minh ha cho loi ch, mo v ng vt c v nh trn:

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

xem nh l lp c s, v ListBox c xem nh l lp dn

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.

Thc thi k tha


Trong ngn ng C# to mt lp dn xut t mt lp ta thm du hai chm vo sau tn lp dn xut v trc tn lp c s:
publicclassListBox:Window

on lnh trn khai bo mt lp mi tn l ListBox, lp ny c dn xut t


Window.

Chng ta c th c du hai chm c th c c nh l dn xut t.

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.

Gi phng thc khi dng ca lp c s


Trong v d 5.1, mt lp mi tn l ListBox c dn xut t lp c s
Window,

lp ListBox c mt phng thc khi dng ly ba tham s. Trong phng thc

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,

inttheLeft, stringtheContents): base(theTop,theLeft)//gikhitolpcs

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

T kha base ch n lp c s cho i tng hin hnh.

iu khin truy xut


Kh nng hin hu ca mt lp v cc thnh vin ca n c th c hn ch thng qua vic s dng cc b sung truy cp: public, private, protected, internal, v
protectedinternal.

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:

publicclassMyClass { //... protectedintmyValue;

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.

Khi form c hin th, n yu cu tt c cc th hin ca Window t thc

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.

Phng thc a hnh


to mt phng thc h tnh a hnh, chng ta cn phi khai bo kha virtual

trong phng thc ca lp c s. V d, ch nh rng phng thc


DrawWindow() virtualvo

ca lp Window trong v d 5.1 l a hnh, n gin l ta thm t kha

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

chng ln phng thc o DrawWindow() ca lp c s. Sau thm cc on

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:

Windowwin=newWindow(1,2); ListBoxlb=newListBox(3,4,Standalonelistbox);Buttonb =newButton(5,6); win.DrawWindow(); lb.DrawWindow(); b.DrawWindow();

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.

Window[]winArray=newWindow[3]; winArray[0]=newWindow(1,2); winArray[1]=newListBox(3,4,Listboxisarray); winArray[2]=newButton(5,6);

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

trong lp Window s c gi ba ln. Tuy nhin do chng ta nh du

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,

mt ListBox, v mt Button. V trnh bin dch s gi chnh xc phng thc ca

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.

T kha new v override


Trong ngn ng C#, ngi lp trnh c th quyt nh ph quyt mt phng thc o bng cch khai bo tng minh t kha override. iu ny gip cho ta a ra mt phin bn mi ca chng trnh v s thay i ca lp c s s khng lm nh hng n chng trnh vit trong cc lp dn xut. Vic yu cu s dng t kha override s gip ta ngn nga vn ny. By gi ta th bn v vn ny, gi s lp c s Window ca v d trc c vit bi mt cng ty A. Cng gi s rng lp ListBox v RadioButton c vit t nhng ngi lp trnh ca cng ty B v h dng lp c s Window mua c ca cng ty A lm lp c s cho hai lp trn. Ngi lp trnh trong cng ty B khng c hoc c rt t s kim sot v nhng thay i trong tng lai vi lp Windowdo cng ty A pht trin.

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(){.} }

Trong cc ngn ng lp trnh hng i tng khc nh C++, phng thc o mi


Sort()trong

lp Window by gi s hnh ng ging nh l mt phng thc c s cho

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(

) trong lp ListBoxth s c bo li l phng thc ph quyt khng hp l.

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

khai bo mt cch tng minh:


publicclassListBox:Window { publicoverridevoidSort(){}

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.

V d 5.3: S dng phng thc v lp tru tng. ----------------------------------------------------------------------------usingSystem; abstractpublicclassWindow { //hmkhidnglyhaithamspublic

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);

} publicclassTester { staticvoidMain() { Window[]winArray=newWindow[3]; winArray[0]=newListBox(1,2,FirstListBox);winArray[1]= newListBox(3,4,SecondListBox);winArray[2]=new Button(5,6); for(inti=0;i<3;i++) { winArray[i].DrawWindow(); } } }

----------------------------------------------------------------------------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);

bng cu lnh sau:


winArray[0]=newWindow(1,2);

Th trnh bin dch s bo mt li nh sau:


CannotcreateaninstanceoftheabstractclassorinterfaceWindow

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()

bnh thng dng chia x bi cc lp dn xut.

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.

Th v l bao gm c cc kiu d liu gi tr.

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

() tr v mt chui th hin lp hin hnh. Sau y l bng tm tt cc phng thc ca lp


Object.

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

----------------------------------------------------------------------------Trong ti liu ca lp Objectphng thc ToString()c khai bo nh sau:


publicvirtualstringToString();

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.

Boxing v Unboxing d liu


Boxing v unboxing l nhng x l cho php kiu d liu gi tr (nh int, long,...) c i x nh kiu d liu tham chiu (cc i tng). Mt gi tr c a vo bn trong c a i tng, c gi l Boxing. Trng hp ngc li, Unboxing s chuyn t i tng ra mt gi tr. X l ny cho php chng ta gi phng thc ToString() trn kiu d liu inttrong v d 5.4.

Boxing c thc hin ngm nh


Boxing l mt s chuyn i ngm nh ca mt kiu d liu gi tr sang kiu d liu tham chiu l i tng. Boxing mt gi tr bng cch to ra mt th hin ca i

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

i 123 int i= 123; o 123 object o=i; i boxed

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); } }

Unboxing phi c thc hin tng minh


Vic a mt gi tr vo mt i tng c thc hin mt cch ngm nh. V s

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.

Cui cng, Pointc th cha cha thnh vin ca kiu int.

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,

chng ta c th tham chiu n lp Tested nh Outer.Nested, khi lp bn

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();

Thm ch khi lp FractionArtistl public, th phm v ca lp ny vn nm bn trong ca lp

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

{ staticvoidMain() { Animal[]Arr=newAnimal[3]; Arr[0]=newDog(LuLu,Vang);Arr[1] =newCat(Mun,5); Arr[2]=newAnimal(Noname); for(inti=0;i<3;i++) {Arr[i].Who(); } } }

-----------------------------------------------------------------------------

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.

S dng t kha operator


281
Np Chng Ton T

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

th trnh bin dch s chuyn biu thc vo:


Fraction.operator+(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.

H tr ngn ng .NET khc


Ngn ng C# cung cp kh nng cho php np chng ton t cho cc lp m chng ta xy dng, thm ch iu ny khng hoc cp rt t trong Common Language Specification (CLS). Nhng ngn ng .NET khc nh VB.NET th khng h tr vic np chng ton t, v mt iu quan trng m bo l lp ca chng ta phi h tr cc phng thc thay th cho php nhng ngn ng khc c th gi to ra cc hiu ng tng t. Do , nu chng ta np chng ton t (+) th chng ta nn cung cp mt phng thc Add() cng lm cng chc nng l cng hai i tng. Np chng ton t c th l mt c php ngn gn, nhng n khng ch l ng dn cho nhng i tng ca chng ta thit lp mt nhim v c a ra.

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
+ *

Tn phng thc thay th


Add Subtract Multiply

Tn ton t Ton t cng Ton t tr Ton t nhn

/ % ^ & | && || = << >> == > < != >= <= *= = ^= <<= %= += &= |= /= ++ + ~

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

Bng 6.1: Tm tt mt s ton t trong C#.

Ton t so snh bng


Nu chng ta np chng ton t bng (==), th chng ta cng nn ph quyt phng thc o Equals() c cung cp bi lp object v chuyn li cho ton t bng thc hin. iu ny cho php lp ca chng ta th tng thch vi cc ngn ng .NET khc khng h tr tnh np

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

kiu long c thc hin ngm nh bi v hin nhin bt k gi tr no ca int

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:

intmyInt=5; longmyLong; myLong=myInt; //ngmnh myInt=(int)myLong;//tngminh

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);

} }

Nu mu s khng cng nhau, th chng ta thc hin nhn cho:


intfirstProduct=lhs.numerator*rhs.denominator; intsecondProduct=rhs.numerator*lhs.denominator; returnnewFraction(firstProduct+secondProduct,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());

Kt qu thc hin cc lnh trn nh sau:


InFractionConstructor(int,int) f1:3/4 InFractionConstructor(int,int) f2:2/4

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());

Hai cu lnh trn s cho ra kt qu nh sau:


Inoperator+

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());

Kt qu c trnh by theo th t sau:


InimplicitconversiontoFraction InFractionConstruction(int)In operator+ InFractionConstructor(int,int) f3+5=f4:25/4

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

lm cho lp ca chng ta hon thin hn.

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

C php khai bo mt cu trc cng tng t nh cch khai bo mt lp:


[thuctnh][bsungtruycp]struct<tncutrc>[:danhschgiaodin] { [thnhvincacutrc]

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);

y mt th hin mi tn l loc1v n c truyn hai gi tr l 200 v 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

to vi gi tr l 200 v 300. Dng lnh sau s gi thc hin b khi to ca

cu trc Location:
Locationloc1=newLocation(200,300);

Sau phng tc WriteLine()c gi:


Console.WriteLine(Loc1location:{0},loc1);

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

truyn vo phng thc myFunc():


t.myFunc(loc1);

Trong phng thc myFunc()hai gi tr mi c gn cho xv y, sau gi tr mi s c xut ra mn hnh:


Loc1location:50,100

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

Sau chy li chng trnh th c kt qu:


Loc1location:200,3000 InmyFuncloc:50,100 Loc1location:50,100

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

B khi to mc nh thit lp tt c cc bin thnh vin vi gi tr 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.

To cu trc khng gi new


Bi v Locationl mt cu trc khng phi l lp, do cc th hin ca n s c to trong stack. Trong v d 7.1 khi ton t newc gi:
Locationloc1=newLocation(200,300);

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;

Nu chng ta th b mt lnh gn v bin dch li:


staticvoidMain() { Locationloc1; loc1.xVal=100; //loc1.yVal=250; Console.WriteLine(loc1); }

Chng ta s nhn mt li bin dch nh sau:


Useofunassignedlocalvariableloc1

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

THC THI GIAO DIN


Thc thi giao din Thc thi nhiu giao din M rng giao din Kt hp cc giao din

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.

Thc thi mt giao din


C php nh ngha mt giao din nh sau:
[thuctnh][bsungtruycp]interface<tngiaodin>[:danhschcs] { <phnthngiaodin> }

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); }

Mc ch ca mt giao din l nh ngha nhng kh nng m chng ta mun

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.

lm c iu ny, chng ta s dng c php ging nh vic to mt lp mi


Documentc tha

k t IStorablebng dng du hai chm (:) v theo sau l tn giao din:

publicclassDocument:IStorable { publicvoidRead() { .... } publicvoidWrite() { .... } }

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.

bin dch s bo mt li. Sau y l on chng trnh minh ha vic xy dng lp


Document thc

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;

doc.Status); //gnchomtgiaodinvsdnggiaodin IStorableisDoc=(IStorable)doc; isDoc.Status=0;

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.

Thc thi nhiu giao din


Trong ngn ng C# cho php chng ta thc thi nhiu hn mt giao din. V d, nu lp Document c th c lu tr v d liu cng c nn. Chng ta c th chn thc thi c hai giao din IStorable v ICompressible. Nh vy chng ta phi thay i phn khai bo trong danh sch c s ch ra rng c hai giao din iu c thc thi, s dng du phy (,) phn cch gia hai giao din:
publicclassDocument:IStorable,ICompressible

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

M rng giao din


C# cung cp chc nng cho chng ta m rng mt giao din c bng cch thm cc phng thc v cc thnh vin hay b sung cch lm vic cho cc thnh vin. V d, chng ta c th m rng giao din ICompressible vi mt giao din mi l ILoggedCompressible. Giao din mi ny m rng giao din c bng cch thm phng thc ghi log cc d liu lu:
interfaceILoggedCompressible:ICompressible { voidLogSavedBytes(); }

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.

V giao din cui cng trong v d l IEncrypt.

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

isc.LogSaveBytes();//ILoggedCompressible isc.Compress();//ICompress isc.Read(); } //IStorable

Truy cp phng thc giao din


Chng ta c th truy cp nhng thnh vin ca giao din IStorablenh th l cc thnh vin ca lp Document:
Documentdoc=newDocument(TestDocument); doc.status=1; doc.Read();

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();

Tuy nhin chng ta c th to th hin ca lp thc thi nh sau:


Documentdoc=newDocument(TestDocument);

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;

Chng ta c th kt hp nhng bc trn nh sau:


IStorableisDoc=(IStorable)newDocument(TestDocument);

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.

Gn i tng cho mt giao din


Trong nhiu trng hp, chng ta khng bit trc mt i tng c h tr mt giao din a ra. V d, gi s chng ta c mt tp hp nhng i tng Document, mt vi i tng c lu tr v s cn li th cha. V gi s chng ta thm giao

din giao din th hai, ICompressiblecho nhng i tng nn d liu v truyn qua mail nhanh chng:
interfaceICompressible {

voidCompress(); voidDecompress(); }

Nu a ra mt kiu Document, v ta cng khng bit l lp ny c h tr giao din


IStorablehay ICompressiblehoc c hai.

Ta c th c on chng trnh sau:

Documentdoc=newDocument(TestDocument); IStorableisDoc=(IStorable)doc; isDoc.Read(); ICompressibleicDoc=(ICompressible)doc; icDoc.Compress();

Nu Documentch thc thi giao din IStorable:


publicclassDocument:IStorable

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.

Phn ngoi l s c trnh by trong Chng 11.

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.

V d 8.3: S dng ton t is. ----------------------------------------------------------------------------usingSystem; interfaceIStorable { voidRead(); voidWrite(objectobj);

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_0032: callvirt IL_0037: br.s

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.

Giao din i lp vi lp tru tng


Giao din rt ging nh cc lp tru tng. Tht vy, chng ta c th thay th khai bo ca IStorabletr thnh mt lp tru tng:
abstractclassStorable { abstractpublicvoidRead(); abstractpublicvoidWrite(); }

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...

.....

publicvoidRead() {...} publicvoidWrite(objecto) {...} //.... }

Thc thi ph quyt giao din


Khi thc thi mt lp chng ta c th t do nh du bt k hay tt c cc phng thc thc thi giao din nh l mt phng thc o. V d, lp Document thc thi giao din IStorable v c th nh du cc phng thc Read() v Write() nh l phng thc o. Lp Document c th c v vit ni dung ca n vo mt kiu d liu File. Nhng ngi pht trin sau c th dn xut mt kiu d liu mi t lp Document, c th l lp Note hay lp EmailMessage, v nhng ngi ny mong mun lp Note c v vit vo c s d liu hn l vo mt tp tin. V d 8.4 m rng t v d 8.3 v minh ha vic ph quyt mt thc thi giao din. Phng thc Read() c nh du nh phng thc o v thc thi bi
Document.Read() v Document.

cui cng l c ph quyt trong kiu d liu Notec dn xut t

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); }

//nhduphngthcReado publicvirtualvoidRead() { Console.WriteLine(DocumentReadMethodforIStorable);

} //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!

----------------------------------------------------------------------------Trong v d trn, lp Documentthc thi mt giao din n gin l IStorable:

inte rfac e ISto rabl

{ 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

thc hin mt cch a hnh nhng phng thc Write()th khng, do ta c

kt xut sau:
OverridingtheReadmethodforNote! DocumentWriteMethodforIStorable

Phng thc Read()v Write()cng c gi trc tip t bn thn i tng:


theNote.Read(); theNote.Write();

v mt ln na chng ta thy vic thc thi a hnh lm vic:

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!

Thc thi giao din tng minh


Trong vic thc thi giao din cho ti gi, nhng lp thc thi (trong trng hp ny l Document) to ra cc phng thc thnh vin cng k hiu v kiu tr v nh l phng thc c m t trong giao din. Chng ta khng cn thit khai bo tng minh rng y l mt thc thi ca mt giao din, vic ny c hiu ngm bi trnh bin dch. Tuy nhin, c vn xy ra khi mt lp thc thi hai giao din v c hai giao din ny c cc phng thc cng mt k hiu. V d 8.5 to ra hai giao din: IStorablev ITalk. Sau thc thi phng thc Read() trong giao din ITalk c ra ting ni dung ca mt cun sch. Khng may l phng thc ny s tranh chp vi phng thc Read() ca
IStorable m Documentphi thc Document phi

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();

Phng thc ny c hiu ngm l public.

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

-----------------------------------------------------------------------------

La chn vic th hin phng thc giao din


Nhng ngi thit k lp c th thu c li khi mt giao din c thc thi thng qua thc thi tng minh v khng cho php cc thnh phn client ca lp truy cp tr phi s dng thng qua vic gn cho giao din. Gi s ngha ca i tng Document ch ra rng n thc thi giao din
IStorable,

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,

nhng phng thc Talk.Read()ch c th hin thng qua gn cho giao

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

v lp Documentthc thi phng thc Talk.Read()khng phi o.

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(){...} }

Truy cp lp khng cho dn xut v kiu gi tr

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

d interface theStruct.Status: 2, isTemp: 4 Changed object

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);

Kt qu l gi tr ca statusc thit lp:


theStruct.Status=1;

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);

nh chng ta thy kt qu thc hin c mt im khc bit:


ChangedinterfacetheStruct.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:

//thanigitrlnnatheStruct.Status= 6;Console.WriteLine(Changedobject); Console.WriteLine(theStruct.Status:{0},isTemp:{1}, theStruct.Status,isTemp.Status);

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

Ta th xem on m IL hiu tham v cch thc hin trn:

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

(classSystem.String,classSystem.Object) IL_0029: ldloca.s theStruct

002b: IL_002c:

ldc.i4.2 call instancevoidmyStruct::set_status(int32)

IL_0031: IL_0036: IL_003b: IL_0040: IL_0042: IL_0047: IL_0048: IL_004a: IL_004f:

ldstr call ldstr ldloca.s call stloc.2 ldloca.s box call

Changedobject void[mscorlib]System.Console::WriteLine theStruct.Status:{0} theStruct instanceint32myStruct::get_status() V_2 [mscorlib]System.Int32 void[mscorlib]System.Console::WriteLine

(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

theStruct.Status:{0},isTemp:{1} theStruct instanceint32myStruct::get_status() V_2 [mscorlib]System.Int32 instanceint32IStorable::get_status() V_2 [mscorlib]System.Int32 void[mscorlib]System.Console::WriteLine

(classSystem.String,classSystem.Object,classSystem.Object) IL_00cd: ret

}//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 {

longwidth; longheight; doubleArea(); doubleCircumference(); intSide(); }

----------------------------------------------------------------------------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

Cu lnh lp foreach Mng a chiu


Mng a chiu cng kch thc Mng a chiu kch thc khc nhau Chuyn i mng System.Array

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

tnh ging nhau tr nn n gin hn, mt lp c ch mc th ging nh mt mng.

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

nh trong mng. Bng 9.1: Cc phng thc v thuc tnh ca System.Array.

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

d liu ca chng. S nguyn l kiu d liu gi tr, v do nhng thnh phn ca

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;

v chng ta to th hin ca mng nh sau:


myButtonArray=newButton[3];

Ghi ch: chng ta c th vit ngn gn nh sau:


ButtonmuButtonArray=newButton[3];

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.

Truy cp cc thnh phn trong mng


truy cp vo thnh phn trong mng ta c th s dng ton t ch mc ([]). Mng dng c s 0, do ch mc ca thnh phn u tin trong mng lun lun l 0. Nh v d trc thnh phn u tin l myArray[0]. Nh trnh by phn trc, mng l i tng, v do n c nhng thuc tnh. Mt trong nhng thuc tnh hay s dng l Length, thuc tnh ny s bo cho bit s i tng trong mt mng. Mt mng c th c nh ch mc t 0 n Length 1. Do nu c nm thnh phn trong mng th cc ch mc l: 0, 1, 2, 3, 4. V d 9.1 minh ha vic s dng cc khi nim v mng t u chng ti gi. Trong v d mt lp tn l Testerto ra mt mng kiu Employeev mt mng s nguyn. To cc

i tng Employeesau in hai mng ra mn hnh.

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);

} //xutmngEmployee for(inti=0;i<empArray.Length;i++) { Console.WriteLine(empArray[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

bng cc lnh trong vng lp.

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.

Khi to thnh phn ca mng


Chng ta c th khi to ni dung ca mt mng ngay lc to th hin ca mng bng cch t nhng gi tr bn trong du ngoc ({}). C# cung cp hai c php khi to cc thnh phn ca mng, mt c php di v mt c php ngn:
int[]myIntArray=newint[5]{2,4,6,8,10}; int[]myIntArray={2,4,6,8,10};

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.

S dng t kha params


Chng ta c th to mt phng thc ri sau hin th cc s nguyn ra mn hnh console bng cch truyn vo mt mng cc s nguyn v s dng vng lp foreach duyt qua tng thnh phn trong mng. T kha params cho php chng ta truyn mt s bin ca tham s m khng cn thit phi to mt mng. Trong v d k tip, chng ta s to mt phng thc tn DisplayVals(), phng thc ny s ly mt s cc bin ca tham s nguyn:

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); } } } }

-----------------------------------------------------------------------------

Kt qu ca v d 9.2 cng tng t nh v d 9.1. Tuy nhin, vi vic s dng vng lp


for

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.

Mng a chiu cng kch thc


Mng a chiu cng kch thc cn gi l mng hnh ch nht (rectanguler array). Trong mng hai chiu c in, chiu u tin c tnh bng s dng ca mng v chiu th hai c tnh bng s ct ca mng. khai bo mng hai chiu, chng ta c th s dng c php theo sau:
<kiudliu>[,]<tnmng>

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

----------------------------------------------------------------------------Trong v d ny, chng ta khai bo hai gi tr:


constintrows=4; constintcolumns=3;

hai gi tr ny c s dng khai bo s chiu ca mng:


int[,]rectangularArray=newint[rows,columns];

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

khi iu ny thc hin xong th chng trnh s chuyn qua


rectangularArray[1,0], rectangularArray[1,1],

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

dung. V d 9.5: Khi to mng a chiu. -----------------------------------------------------------------------------

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.

Mng a chiu c kch khc nhau


Cng nh gii thiu trc kch thc ca cc chiu c th khng bng nhau, iu ny khc vi mng a chiu cng kch thc. Nu hnh dng ca mng a chiu cng kch thc c dng hnh ch nht th hnh dng ca mng ny khng phi hnh ch nht v cc chiu ca chng khng iu nhau. Khi chng ta to mt mng a chiu kch thc khc nhau th chng ta khai bo s dng trong mng trc. Sau vi mi dng s gi mt mng, c kch thc bt k. Nhng mng ny c khai bo ring. Sau chng ta khi to gi tr cc thnh phn trong nhng mng bn trong. Trong mng ny, mi chiu l mt mng mt chiu. khai bo mng a chiu c kch thc khc nhau ta s dng c php sau, khi s ngoc ch ra s chiu ca mng:
<kiudliu>[][]...

V d, chng ta c th khai bo mng s nguyn hai chiu khc kch thc tn myJagged
Arraynh

sau:

int[][]myJaggedArray;

Chng ta c th truy cp thnh phn th nm ca mng th ba bng c php:


myJaggedArray[2][4].

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

phn ca n c t ng gn gi tr mc nh. V ta ch cn gn mt s gi tr cn thit.

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,

jaggedArray[0][i]); } for(inti=0;i<2;i++) { Console.WriteLine(jaggedArray[1][{0}]={1},

i,jaggedArray[1][i]); } for(inti=0;i<3;i++) { Console.WriteLine(jaggedArray[2][{0}]={1},i, jaggedArray[2][i]); } for(inti=0;i<5;i++) { Console.WriteLine(jaggedArray[3][{0}]={1},i, jaggedArray[3][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

----------------------------------------------------------------------------Trong v d ny, mng c to vi bn dng:


int[][]jaggedArray=newint[rows][];

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

kch thc khc nhau:

//dngutinc5phnt jaggedArray[0]=newint[5]; //dngthhaic2phnt jaggedArray[1]=newint[2]; //dngthbac3phnt jaggedArray[2]=newint[3]; //dngcuicngc5phnt jaggedArray[3]=newint[5];

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

yEmployeeArray); //tomnggmhaichui string[]array={hello,world}; //xutranidungcachui

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

----------------------------------------------------------------------------V d 9.7 bt u bng vic to mt lp n gin Employee nh cc v d trc. Lp


Testerby

gi c thm mt phng thc tnh PrintArray() xut ni dung ca mng,

phng thc ny c khai bo mt tham s l mng mt chiu cc i tng object:


publicstaticvoidPrintMyArray(object[]theArray) objectl

lp c s ngm nh cho tt c cc i tng trong mi trng .NET, nn n c

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());

Tn ca kiu d liu mng c in ra:


ContentsoftheArrayProgramming_CSharp.Employee[] ... ContentsoftheArraySystem.String[]

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

nhng nu gi th cng khng c hi g v n gip cho ta i x vi cc i tng mt cch a hnh.

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

----------------------------------------------------------------------------V d bt u bng vic to mng myArray, mng cc chui vi cc t sau:


Who,is,Kitty,Mun

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

Tng t nh vy, v d cng to ra mng th hai, myOtherArray, cha nhng t sau:


Chung,toi,la,nhung,nguoi, lap,trinh,my,tnh

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

tn l myListBox cha mt danh sch cc chui lu tr trong mt mng mt

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;}

Kiu tr v c quyt nh bi kiu ca i tng c tr v bi b ch mc, trong

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) {

//xlkhichmcsai } else strings[ctr++]=theString;

} //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 tn nn ta dng t kha this:


publicstringthis[intindex]

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 } }

Do vy, nu chng ta vit:


myStrings[10]=HelloC#;

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()

kim tra gi tr Lengthca b m hn l gi tr hin thi ca b m s i tng.

Nu mt gi tr c nhp vo cho ch mc cha c gi tr, chng ta c th cp nht b m nh sau:


set { if(index>=strings.Length) { //chmcvtqustiacamng } else { strings[index]=value; if(ctr<index+1) ctr=index+1; } }

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!;

Kt qu thc hin tng t nh sau:


lbt[0]: Hello lbt[1]: Universe lbt[2]: Who lbt[3]: is lbt[4]: Ngoc lbt[5]: Mun lbt[6]: lbt[7]: lbt[8]: lbt[9]: lbt[10]: ah!

S dng kiu ch s khc


Ngn ng C# khng i hi chng ta phi s dng gi tr nguyn lm ch mc trong mt tp hp. Khi chng ta to mt lp c cha mt tp hp v to mt b ch mc, b ch

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 { } }

return this[findString(i ndex)];

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

lbt[3]: is lbt[4]: Ngoc lbt[5]: Mun

----------------------------------------------------------------------------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

Mc ch Lit k thng qua mt tp hp bng cch s dng


foreach. Thc thi Count,

bi tt c cc tp hp cung cp

phng thc CopyTo() cng nh cc thuc tnh


IComparer

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

Dng trong cc tp hp da trn kha v gi tr nh


Hashtablev SortedList.

Cho php lit k dng cu lnh foreach qua tp hp h tr IDictionary. Bng 9.2: Giao din cho tp hp.

Giao din IEnumerable


Chng ta c th h tr c php foreach trong lp ListBoxTest bng vic thc thi giao din IEnumerator. Giao din ny ch c mt phng thc duy nht l GetEnumerator(), cng vic ca phng thc l tr v mt s thc thi c bit ca IEnumerator. Do vy, ng ngha ca lp Enumerablel n c th cung cp mt Enumerator:
publicIEnumeratorGetEnumerator() { return(IEnumerator)newListBoxEnumerator(this); } Enumeratorphi

thc thi nhng phng thc v thuc tnh IEnumerator. Chng c th c

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(),

y l mt lp privatec nh ngha bn trong lp ListBoxTest. Lp ny

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()

{ index++; if(index>=lbt.strings.Length) returnfalse; else returntrue; }

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;

foreach(stringsinlbt) { Console.WriteLine(Value{0}:{1},count,s); count++;

} } } }

----------------------------------------------------------------------------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.

Giao din ICollection


Mt giao din quan trng khc cho nhng mng v cho tt c nhng tp hp c cung cp bi .NET Framework l ICollection. ICollection cung cp bn thuc tnh: Count, IsReadOnly, IsSynchronized, v SyncRoot. Ngoi ra ICollection cng cung cp mt

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.

Giao din IComparer


Giao din IComparercung cp phng thc Compare(), so snh hai phn t trong mt tp hp c th t. Phng thc Compare()thng c thc thi bng cch gi phng thc
CompareTo()ca

mt trong nhng i tng. CompareTo()l phng thc c trong tt c

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.

Danh sch mng


Mt vn hn ch ca kiu d liu mng l kch thc c nh. Nu chng ta khng bit trc s lng i tng trong mt mng s c lu gi, th s kh khn v c th chng ta khai bo kch thc ca mng qu nh (vt qu kch thc lu tr ca mng) hoc l kch thc qu ln (dn n lng ph b nh). Chng trnh ca chng ta c th hi ngi dng v kch thc, hoc thu nhng input t trong mt web site.Tuy nhin vic xc nh s lng ca i tng trong nhng session c tnh cht tng tc ng l khng thch hp. Vic s dng mng c kch thc c nh l khng thch hp cng nh l chng ta khng th on trc c kch thc ca mng cn thit. Lp ArrayList l mt kiu d liu mng m kch thc ca n c gia tng mt cch ng theo yu cu. ArrayList cung cp mt s phng thc v nhng thuc tnh cho nhng thao tc lin quan n mng. Mt vi phng thc v thuc tnh quan trng ca
ArrayList

c lit k trong bng 9.3 nh sau: Phng thc- thuc tnh


Adapter()

Mc ch Phng thc staticto mt wrapper ArrayListcho i tng IList

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

dng tm kim nh phn

nh v mt thnh phn xc nh trong ArrayList c


Clear() Clone() Contains() CopyTo() GetEnumerator() GetRange() IndexOf() Insert() InsertRange(0

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

LastIndexOf() Remove() RemoveAt() RemoveRange() Reverse() SetRange() Sort() ToArray() TrimToSize()

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

mt thuc tnh l Capacity, a ra s thnh phn m ArrayListc th lu tr:

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

Chng ta c th lm bng tay thay i gi tr ca Capacity bng hay ln hn gi tr


Count.

Nu thit lp gi tr ca Capacity nh hn gi tr ca Count, th chng trnh s

pht sinh ra ngoi l c kiu nh sau ArgumentOutOfRangeException.

Thc thi IComparable


Ging nh tt c nhng tp hp, ArrayList cng thc thi phng thc Sort() cho php chng ta thc hin vic sp xp bt c i tng no thc thi IComparable. Trong v d k tip sao, chng ta s b sung i tng Employee thc thi IComparable:
publicclassEmployee:IComparable

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); }

Phng thc CompareTo() ly mt i tng lm tham s, i tng Employee phi so

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.

Thc thi IComparer


Khi chng ta gi phng thc Sort() trong ArrayList th phng thc mc nh ca IComparer c gi, n s dng phng php QuickSort gi thc thi
IComparablephng thc CompareTo()trong mi

thnh phn ca ArrayList.

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

tip sau y, chng ta s thm trng th hai vo trong Employee l yearsOfSvc. V


Employeec

th

c sp xp theo hai loi l empIDhoc l yearsOfSvc.

thc hin c iu ny, chng ta cn thit phi to li s thc thi ca


IComparer

truyn cho phng thc Sort()ca mng ArrayList. Lp IComparer

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;

kiu lit k vi hai gi tr, empIDhay yearsOfSvc, hai gi tr ny ch ra rng

chng ta mun sp xp theo ID hay s nm phc v:


publicenumComparisionType { EmpID, Yrs };

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);

Khi chng ta gi Sort()th ArrayLists gi phng thc Compare()trong Employee


Comparer,

n lt n s y quyn vic so snh cho phng thc Employee.CompareTo(),

v truyn vo thuc tnh WhichComparisionca n:


Compare(objectlhs,objectrhs) { Employeel=(Employee)lhs; Employeer=(Employee)rhs;

returnl.CompareTo(r.WhichComparision); }

i tng Employeephi thc thi mt phin bn ring ca CompareTo() thc hin vic so snh:

publicintCompareTo(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; }

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) {

Employeel=(Employee)lhs; Employeer=(Employee)rhs; returnl.CompareTo(r,WhichComparision);

} 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;

//spxpvhinthmng Employee.EmployeeComparerc=Employee.GetComparer(); c.WhichComparision Employee.EmployeeComparer.ComparisionType.EmpID; =

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

-------------------------------------

-----------------------------------

Khi u tin hin th kt qu th t va nhp vo. Trong gi tr ca empID, v


yearsOfSvcc

pht sinh ngu nhin. Khi th hai hin th kt qu sau khi sp theo empID,

v khi cui cng th hin kt qu c xp theo nm phc v.

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());

{ IEnumeratormyEnumerator=myCollection.GetEnumerator(); while(myEnumerator.MoveNext())Console.Write({0}, myEnumerator.Current);

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()

Phng thc statictr v mt Stackwrapper c thread-safe.

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 );

} publicstaticvoidPrintValues(IEnumerablemyCollection) { IEnumeratormyEnumerator=myCollection.GetEnumerator(); while(myEnumerator.MoveNext())Console.Write({0}, myEnumerator.Current);Console.WriteLine(); } } }

----------------------------------------------------------------------------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

mt kiu t in c ti u cho vic truy cp c nhanh. Mt s

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

Thuc tnh tr v i tng c th c s dng ng b truy cp Hastable.

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.

Giao din IDictionary


Hashtable l

mt t in v n thc thi giao din IDictionary. IDictionary cung cp mt thuc

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) {

Console.WriteLine({0},s); } //xuttpgitr foreach(stringsinvalues) { Console.WriteLine({0},s); } } } }

----------------------------------------------------------------------------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,...

Giao din IDictionaryEnumerator


Nhng i tng IDictionary cng h tr vng lp foreach bng vic thc thi phng thc GetEnumerator(), phng thc ny tr v mt IDictionaryEnumerator. IDictionaryEnumerator c s dng lit k bt c i tng IDictionary no. N cung cp thuc tnh truy cp c kha v gi tr cho mi thnh phn trong t in. Ta c v d 9.19 minh ha nh sau: V d 9.16: s dng giao din IDictionaryEnumerator. ----------------------------------------------------------------------------namespaceProgrmming_CSharp { usingSystem; usingSystem.Collections; publicclassTester { staticvoidMain()

//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

danh snh hc vin ca lp thng qua b ch mc.

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

Cc biu thc quy tc


S dng biu thc quy tc qua lp Regex S dng Regex tm tp hp S dng Regex gom nhm S dng lp CaptureCollection

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

i vi nhng lp khc trong h thng .NET.

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.

To chui dng phng thc ToString ca i tng


Mt cch rt ph bin khc to mt chui l gi phng thc ToString()ca mt i tng v gn kt qu n mt bin chui. Tt c cc kiu d liu c bn ph quyt phng thc ny rt n gin l chuyn i gi tr (thng thng l gi tr s) n mt chui th hin ca gi tr. Trong v d theo sau, phng thc ToString()ca kiu d liu int c gi lu tr gi tr ca n trong mt chui:
intmyInt=9; stringintString=myInt.ToString();

Phng thc myInt.ToString() tr v mt i tng String v i tng ny c gn cho


intString.

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).

Thao tc trn chui


Lp stringcung cp rt nhiu s lng cc phng thc so snh, tm kim v thao tc trn chui, cc phng thc ny c trnh by trong bng 10.1: System.String Phng thc/ Trng
Empty Compare() CompareOrdinal() Concat() Copy() Equal() Format() Intern() IsInterned() Join() Chars() Length() Clone() CompareTo() CopyTo() EndsWidth() Insert() LastIndexOf() PadLeft() PadRight()

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);

//Ngoiratacthkthpnhsau strings9=s3.Insert(s3.IndexOf(CNTT),nhanluc); Console.WriteLine(S9:{0}\n,s9); }//endMain } //endclass

}//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);

Lc ny th vic so snh hon ton ging nhau v kt qu tr v l gi tr 0:


Khongphanbietchuthuongvahoa S1:abcd,S2:ABCD,ketqua:0

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;

Kt qu ca hai cch to trn u hon ton nh nhau:


S6duocsaocheptuS5:abcdABCDS7 =S6:abcdABCD

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);

Trong c ba trng hp th kt qu tr v l mt gi tr Boolean, ta c kt qu nh sau:


S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6==S7?:True

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

Console.WriteLine(S3:{0}\nketthucvoichuCNTT?:{1}\n,s3, s3.EndsWith(CNTT)); Console.WriteLine(S3:{0}\nketthucvoichuNam?:{1}\n,s3, s3.EndsWith(Nam));

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);

Kt qu cui cng cng tng t nh cch chn bn trn:


S9:TrungTamDaoTaonhanlucCNTT

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()

c gi trong chui ny, v truyn kt qu vo mi vng lp:

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.

Thao tc trn chui dng StringBuilder


Lp StringBuilder c s dng to ra v b sung cc chui. Hay c th ni lp ny chnh l phn ng gi ca mt b khi dng cho mt String. Mt s thnh vin quan trng StringBuilderc tm tt trong bng 10.2 nh sau: System.StringBuilder ngha Truy cp hay gn mt s k t m StringBuildernm gi. Ch mc. Thit lp hay truy cp chiu di ca chui Truy cp dung lng ln nht ca StringBuilder Ni mt kiu i tng vo cui ca StringBuilder Thay th nh dng xc nh bng gi tr c nh dng cam bo i ng StringBuilderhin thi c kh nng ti thiu mt r tng. ln nh mt gi tr xc nh. Chn mt i tng vo mt v tr xc nh Thay th tt c th hin ca mt k t xc nh vi nhng Bng k tPhng thc ca lp StringBuilder 10.2 mi.

Phng thc
Capacity() Chars() Length() MaxCapacity() Append() AppendFormat() EnsureCapacity() Insert() Replace()

Khng ging nh String, StringBuilderth d thay i. Khi chng ta b sung mt i tng


StringBuilder th

chng ta lm thay i trn gi tr tht ca chui, ch khng phi trn

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

tin hn l vic s dng cc ton t b sung trong chui.

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

Cc biu thc quy tc (Regular Expression)


Biu thc qui tc l mt ngn ng mnh dng m t v thao tc vn bn. Mt biu thc qui tc thng c p dng cho mt chui, hay mt tp hp cc k t. Thng thng mt chui l ton b vn bn hay ti liu. Kt qu ca vic p dng mt biu thc qui tc n mt chui l tr v mt chui con hoc l tr v mt chui mi c th c b sung t mt vi phn ca chui nguyn thy ban u. Chng ta nn nh rng string l khng th thay i c v do cng khng th thay i bi biu thc qui tc. Bng cch p dng chnh xc biu thc qui tc cho chui sau:
Mot,hai,ba,TrungTamDaoTaoCNTT

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 biu thc quy tc qua lp Regex


MS.NET cung cp mt hng tip cn hng i tng (object- oriented approad) cho biu thc quy tc so khp, tm kim v thay th chui. Biu thc quy tc ca ngn ng C# l c xy dng t lp regexpca ngn ng Perl5. Namspace System.Text.RegularExpressions ca th vin BCL (Base Class Library) cha ng tt c cc i tng lin quan n biu thc quy tc trong mi trng .NET. V lp quan trng nht m biu thc quy tc h tr l Regex. Ta c th to th hin ca lp
Regexv

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

{ staticvoidMain() { //khitochuisdng strings1=Mot,hai,ba,TrungTamDaoTaoCNTT;

//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.

S dng Regex tm kim tp hp


Hai lp c thm vo trong namespace .NET cho php chng ta thc hin vic tm kim mt chui mt cch lp i lp li cho n ht chui, v kt qu tr v l mt tp hp. Tp hp c tr v c kiu l MatchCollection, bao gm khng c hay nhiu i tng Match. Hai thuc tnh quan trng ca nhng i tng Match l chiu di v gi tr ca n, chng c th c c nh trong v d minh ha 10.7 di y. V d minh ha 10.7: S dng MatchCollection v Match. ----------------------------------------------------------------------------namespaceProgramming_CSharp { usingSystem; usingSystem.Text.RegularExpressions; classTester { staticvoidMain() { stringstring1=NgonngulaptrinhCSharp; //tmbtcchuiconnokhngckhongtrng //bntrongvktthclkhongtrng RegextheReg=newRegex(@(\S+)\s); //totphpvnhnktqusokhp MatchCollectiontheMatches=theReg.Matches(string1); //lplyktquttphp foreach(MatchtheMatchintheMatches) { Console.WriteLine(Chieudai:{0},theMatch.Length); //nutntichuithxutraif( theMatch.Length!=0) { Console.WriteLine(Chuoi:{0},theMatch.ToString()); }//endif }//endforeach }//endMain

}//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 d 10.7 bt u bng vic to mt chui tm kim n gin:


stringstring1=NgonngulaptrinhCSharp;

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.

S dng Regex gom nhm


i khi lp trnh chng ta cn gom nhm mt s cc biu thc tng t vi nhau theo mt quy nh no . V d nh chng ta cn tm kim a ch IP v nhm chng li vo trong nhm IPAddressesc tm thy bt c u trong mt chui. Lp Groupcho php chng ta to nhng nhm v tm kim da trn biu thc quy tc, v th hin kt qu t mt nhm biu thc n. Mt biu thc nhm nh r mt nhm v cung cp mt biu thc quy tc, bt c chui con no c so khp bi biu thc quy tc th s c thm vo trong nhm. V d,

to mt nhm chng ta c th vit nh sau:


@(?<ip>(\d|\.)+)\s

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

}//endMain }//endclass }//endnamespace

----------------------------------------------------------------------------V d minh ha 10.8 bt u bng vic to mt chui n gin tm kim nh sau:


stringstring1=10:20:30127.0.0.0Dolphin.net;

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

Tng t nh vy vi nhm ipv site:

Console.WriteLine(IP:{0},theMatch.Groups[ip]); //hinthachwebsite Console.WriteLine(site:{0},theMatch.Groups[site]);

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;

Chui ny s to ra ba chui con so khp c tm thy trong MatchCollection. V kt qu ta c th thy c l:


theMatch:10:20:30127.0.0.0Dolphin.net Time:10:20:30 IP:127.0.0.0 site:Dolphin.net theMatch:10:20:31127.0.0.0Mun.net Time:10:20:31 IP:127.0.0.0 Site:Mun.net theMatch:10:20:32127.0.0.0Msn.nettime: 10:20:32 IP:127.0.0.0 Site: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

mt Capture (Group is-a Capture), l mt i tng Capture ng gi cc

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

{ usingSystem; usingSystem.Text.RegularExpressions; classTest

{ 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 :

-----------------------------------------------------------------------------

atch: 10:20:30 IBM 127.0.0.0 HP Time: 10:20:30 IP: 127.0.0.0

Company: HP Capture: IBM Capture: HP

----------------------------------------------------------------------------Trong on vng lp cui cng:


foreach(CapturecapintheMatch.Groups[Company].Captures) { Console.WriteLine(Capture:{0},cap.ToString()); }//endforeach

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];

i tng Groupc mt tp hp tn l Captures, v dng lnh tip sau tr v mt tp hp


Capturescho Grouplu

gi ti Groups[company] bn trong i tng theMatch:

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

C ch publishing subscribing S kin & y quyn

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.

S dng y quyn xc nhn phng thc lc thc thi


y quyn nh chng ta bit l c dng xc nh nhng loi phng thc c th c dng x l cc s kin v thc hin callback trong chng trnh ng dng. Chng

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

cung cp mt phng thc ch ra cho chng ta bit cch sp xp cc i tng.

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

lp Student. Hai lp ny c t im chung vi nhau, ngoi tr c hai thc thi nhng

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:

publicclassPair { //avo2itngtheotht publicPair(objectfirstObjectr,objectsecondObject) { thePair[0]=firstObject;

thePair[1]=secondObject; } //binlugihaiitng privateobject[]thePair=newobject[2]; }

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);

Gi tr tr v l kiu comparisony l kiu lit k:


publicenumcomparison { theFirstComesFirst=1, theSecondComesFirst=2 }

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) {

objecttemp=thePair[0]; thePair[0]=thePair[1]; thePair[1]=temp; } }

Phng thc ny ly mt tham s: mt y quyn c kiu WhichIsFirstvi tn l


theDelegateFunc.

Phng thc Sort giao ph trch nhim quyt nh th t n trc sau

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

v phng thc ReverseSort s hon i v tr ca hai i tng ny,

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; } }

Lp i tng Studentny yu cu hai phng thc, mt l phng thc ph quyt ToString


(),

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

Lp Studentphi ph quyt phng thc ToString() cho phng thc ToString()ca lp


Pairs

l tr v tn ca sinh vin:
publicoverridestringToString() { returnname; } Studentcng

phi thc thi mt phng thc h tr cho Pair.Sort()c th y quyn xc nh

th t ca hai i tng xem i tng no n trc:


publicstaticcomparisonWhichStudentComesFirst(Objecto1,Objecto2) { Students1=(Student)o1; Students2=(Student)o2; return(String.Compare(s1.name,s2.name)<0? comparison.theFirstComesFirst: comparison.theSecondComesFirst); } String.Compare l

phng thc ca .NET trong lp String, phng thc ny so snh

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;

//khaibokiulitkpublic enumcomparison { theFirstComesFirst=1,

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());

studentPair.ReverseSort(theStudentDelegate); Console.WriteLine(SaukhisapxepnguocstudentPair\t\t:{0}, studentPair.ToString()); catPair.Sort(theCatDelegate); Console.WriteLine(SaukhisapxepcatPair\t\t:{0}, catPair.ToString()); catPair.ReverseSort(theCatDelegate); Console.WriteLine(SaukhisapxepnguoccatPair\t\t:{0}, catPair.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);

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());

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);

ngha ca lnh trn l to mt y quyn tnh tn l OrderStudentsv c thuc tnh ch c


readonly.

Vic thm vo thuc tnh readonly ghi ch rng mt khi trng c to ra

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);

Console.WriteLine(SaukhisapxepstudentPair\t\t:{0},studentPair.ToString()); studentPair.ReverseSort(Student.OrderStudents); Console.WriteLine(SaukhisapxepnguocstudentPair\t\t:{0},

studentPair.ToString()); catPair.Sort(theCatDelegate); Console.WriteLine(SaukhisapxepcatPair\t\t:{0},catPair.ToString()); catPair.ReverseSort(Cat.OrderCats); Console.WriteLine(SaukhisapxepnguoccatPair\t\t:{0},catPair.ToString());

Kt qu thc hin tng t nh trong v d 11.1

S dng y quyn nh thuc tnh


i vi y quyn tnh th chng bt buc phi c to th hin, do tnh cht tnh, m khng cn bit l chng c c s dng hay khng, nh lp Studentv Cattrong v d bn trn. Chng ta c th pht trin nhng lp ny tt hn bng cch thay th y quyn tnh t trng thnh thuc tnh. Vi lp Studentta c th chuyn khai bo:
publicstaticreadonlyPair.WhichIsFirstOrderStudent= newPair.WhichIsFirst(Student.WhichStudentComesFirst);

thnh khai bo nh sau:


publicstaticPair.WhichIsFirstOrderStudents { get { returnnewPair.WhichIsFirst(WhichStudentComesFirst); } }

Tng t nh vy chng ta thc hin thay th vi lp Cat:


publicstaticPair.WhichIsFirstOderCats { get { returnnewPair.WhichIsFirst(WhichCatComesFirst); } }

Khi truyn cho phng thc th khng thay i: studentPair.Sort( Student.OderStudents);


catPair.Sort(Cat.OrderCats);

Khi thuc tnh OrderStudentsc truy cp th y quyn c to ra:


returnnewPair.WhichIsFirst(WhichCatComesFirst);

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.

Thit lp th t thi hnh vi mng y quyn


y quyn c th gip chng ta to ra mt h thng trong ngi s dng c th quyt nh n th t ca cc hot ng khi thc thi. Gi s chng ta c mt h thng x l nh trong cc nh c th c thao tc bi mt phng php c nh ngha tt nh l: lm m, lm m, xoay, lc nh,... Gi s rng, th t khi s dng cc hiu ng ny c p dng cho nh l quan trng. Ngi s dng mun la chn nhng hiu ng ny t menu, anh ta chn tt c cc hiu ng ty thch, v sau yu cu b x l nh thc hin ln lt cc hiu ng m anh ta xc nh. Chng ta c th to nhng y quyn cho mi hot ng v sau thm chng vo mt tp hp c sp, nh l mt mng chng hn, theo mt th t m ta mun chng thc thi. Mt khi tt c cc y quyn c to ra v a vo tp hp, chng ta d dng lp ln lt qua cc thnh phn ca mng, v thc thi ln lt tng phng thc y quyn. Chng ta bt u bng vic xy dng mt lp Imageth hin mt nh s c x l bi lp
ImageProcessor: publicclassImage { publicImage() { Console.WriteLine(Animagecreated); } }

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); }

publicstaticvoidFilter() { Console.WriteLine(Filteringimage); } publicstaticvoidSharpen() { Console.WriteLine(Sharpeningimage); } publicstaticvoidRotate() { Console.WriteLine(Rotatingimage); }

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; }

cn mt phng thc thm cc y quyn vo trong mng:

publicvoidAddToEffects(DoEffecttheEffect)

Ngoi ra cn cn mt phng thc tht s gi cc y quyn ny:


publicvoidProcessImage() { for(inti=0;i<numEffectsRegistered;i++) { arrayOfEffects[i](); } }

Cui cng, chng ta khai bo nhng y quyn tnh, cc client gi, v chn chng li x

l nhng phng thc:


publicDoEffectBlurEffect=newDoEffect(Blur); publicDoEffectSharpenEffect=newDoEffect(Sharpen);

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]; }

//thmhiungvotrongmng publicvoidAddToEffects(DoEffecttheEffect) { if(numEffectsRegistered>=0)

{ 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

y quyn tr v gi tr void, dng lnh theo sau s kt hp chng li vi nhau

v to ra mt y quyn Multicast mi:


myMulticastDelegate=Writer+Logger;

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,

v Transmitting. Phng thc u tin vit mt chui xut ra mn

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:

Writer(StringpassedtoWriter\n);Logger(String passedtoLogger\n);Transmitter(Stringpassedto Transmitter\n);

xem cch kt hp cc delegate, chng ta to mt th hin delegate khc:


MyClassWithDelegate.StringDelegate myMulticastDelegate;

v gn cho delegate ny kt qu ca php cng hai delegate cho trc:


myMulticastDelegate=Writer+Logger;

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;

//nhnghamtStringDelegatekhcthchinMulticasting MyClassWithDelegate.StringDelegate myMulticastDelegate;

//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

myMulticastDelegate=Logger; //gilidelegate,lcnychcnthchinhaiphngthc myMulticastDelegate(ThirdstringpassedtoCollector); }//endMain }//endclass

}//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

----------------------------------------------------------------------------Trong v d trn, nhng th hin delegate c nh ngha v ba delegate u tin


Writer, Logger,

v Transmitter c gi ra. Delegate th t myMulticastDelegate c gn

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

lp c s cho tt c cc d liu v s kin, lp EventArgs tha k tt c

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

kin ny l OnSecondChange. Chng ta khai bo s kin v kiu delegate x l s kin ca n nh sau:


[attributes] [modifiers]event type membername

V d khai bo nh sau:

publiceventSecondChangeHandler static, virtual,

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, {

v second. Cui cng l mt phng thc Run():

publicvoidRun()

for(;;) { //ngng10giy Thread.Sleep(10);

//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)

{ //toTimeInfoEventArgstruynchoccsubscriber TimeInfoEventArgstimeInformation= newTimeInfoEventArgs(dt.Hour,dt.Minute,dt.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) {

Console.WriteLine(CurrentTime:{0]:{1}:{2}, ti.hour.ToString(),ti.minute.ToString(), ti.Second.ToString());

} }

Khi phng thc u tin Subscribe c gi, n s to ra mt delegate SecondChange


Handlermi,

v truyn vo phng thc x l s kin TimeHasChangedca n. Sau n

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

trn c trnh by trong v 11.4. V d 11.4: lm vic vi nhng s kin. ----------------------------------------------------------------------------namespaceProgramming_CSharp

{ 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;

//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; } } 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(); } }

----------------------------------------------------------------------------Kt qu thc hin c th nh sau:


Current Time: 11:54:20 Logging to file: 11:54:20 Current Time: 11:54:21 Logging to file: 11:54:21 Current Time: 11:54:22 Logging to file: 11:54:22

----------------------------------------------------------------------------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

khng cn bit cch m cc lp subscriber p ng vi s kin m n a ra.

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,...

Lp i tng trong .NET Framework


NET Framework cha s lng nhiu nhng kiu d lp, nhng kiu lit k, nhng cu trc, nhng giao din v nhiu kiu d liu khc na. Tht vy, c hng ngn s lng cc kiu nh trn. Nhng lp ny iu cho php chng ta s dng trong chng trnh C#. Chng ta s tm hiu mt vi kiu d liu thng s dng trong chng ny. Cc lp c trnh by thng qua cc v d minh ha n gin. T nhng v d minh ha cch s dng cc lp c s ny chng ta c th m rng to ra cc chng trnh phc tp hn. 639
Cc Lp C S .NET

Common Language Specification (CLR)


Nhng lp bn trong Framework c vit vi ngn ng c xc nhn l chung nht (CLR). CLR c cp vo phn u ca sch khi chng ta tho lun v MS.NET trong chng 1.

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.

Kiu d liu trong namespace


M ngun bn trong Framework c t chc bn trong namespace. C hng trm namespace bn trong Framework c s dng t chc hng ngn lp i tng v cc kiu d liu khc. Mt vi namespace th c lu tr bn trong namespace khc. V d chng ta s dng kiu d liu DateTime c cha trong namespace System. Kiu Random cng c cha trong namespace System. Nhiu kiu d liu phc v cho thao tc nhp xut cng c lu tr trong mt namespace chc trong namespace Systeml namespace System.IO. Nhiu kiu d liu thng dng lm vic vi d liu XML th c t bn trong namespace System.XML. Chng ta c th tm hiu cc namespace ny trong cc ti liu trc tuyn ca Microsoft nh MSDN Online chng hn.

Tiu chun ECMA


Khng phi tt c kiu d liu bn trong namespace th cn thit phi tng thch vi t t c nhng ngn ng khc. Hn th na, nhng cng c pht trin c to bi nhng cng ty khc cho ngn ng C# c th khng bao hm phi tng thch vi m ngun thng thng. Khi ngn ng C# c hnh thnh. Microsoft xc nhn a ra mt s lng ln cc kiu d liu cho cng mt bng tiu chun cho C# chun ha. Bng cch xc nhn nhng kiu d liu theo mt tiu chun, iu ny xem nh vic m cnh ca cho nhng nh pht trin khc to ra cc cng c v trnh bin dch C# cng s dng nhng namespace v kiu d liu. Khi nhng m ngun bn trong nhng cng c ca Microsoft tng thch vi bt c cng c ca cc cng ty khc. Nhng lp i tng c chun ha th c nh v bn trong namespace System. Nhng namespace khc cha nhng lp khng c chun ha. Nu mt lp khng phi l mt phn ca tiu chun, n s khng c h tr trong tt c h iu hnh v mi

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.

Nhng namespace ny khng phi l mt phn ca tiu chun ECMA. Do

chng c th khng c gi tr trong tt c mi trng pht trin.

Tm hiu nhng lp Framework


Nh chng ta bit l c hng ngn nhng lp v nhng kiu d liu khc bn trong th vin c s. C th s tn vi cun sch c kch thc nh gio trnh ny ni ton b v chng. Trc khi chng ta tm hiu nhng lp c bn, bn c th xem tng quan ti liu trc tuyn bit thm cc lp c c. Tt c cc lp v nhng kiu d liu khc c trnh by trong chng ny iu l mt phn ca tiu chun c xc nhn bi ECMA. Lu : Khng nhng chng ta c th s dng nhng kiu d liu bn trong nhng lp th vin m chng ta cn c th m rng nhng kiu d liu ny.

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

chng trnh ny dng th hin ngy gi trn mn hnh. Timer v nhng s

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(**************************); Console.WriteLine(Path:{0}, Environment.GetEnvironmentVariable(Path));

Console.WriteLine(**************************); } } }

----------------------------------------------------------------------------Kt qu thc hin vi my tnh ca tc gi (kt qu s khc vi my tnh ca bn:)


************************** Command: D:\Working\ConsoleApplication1\bin\Debug\Env01.exe Curr Dir: D:\Working\ConsoleApplication1\bin\Debug Sys Dir: C:\WINDOWS\System32 Version: 1.0.3705.0 OS Version: Microsoft Windows NT 5.1.2600.0 Machine: MUN Memory: 4575232 ************************** Arg 0: D:\Working\ConsoleApplication1\bin\Debug\Env01.exe ************************** Drive 0: A:\ Drive 1: C:\ Drive 2: D:\ Drive 3: E:\ ************************** Path: C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS;C:\WINDO WS\COMMAND;C:\NC **************************

----------------------------------------------------------------------------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

trng v nhng gi tr ca chng trong h thng hin thi.

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 cosinca gc a ra Tr v gi tr sinca gc a ra

Sinh Tan Tanh

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.

Kt qu ca php nhn v lm trn l mt gi tr t -10 n 10 c gn cho val2. Vng lp


forth

hai thc hin vic xut mt k t ra mn hnh.

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).

Sao chp mt tp tin


Mt lp tp tin tn ti bn trong lp c s gi l File, lp ny c nh v bn trong namespace System.OI. Lp File cha mt s cc phng thc tnh c s dng thao tc trn tp tin. Tht vy, tt c cc phng thc bn trong lp Fileiu l tnh. Bng 12.2 lit k nhng phng thc chnh ca lp File.

Lp File Phng thc


AppendText

M t Ni vn bn vo trong mt tp tin

Copy

To ra mt tp tin mi t tp tin hin hu

Create CreateText Delete Exists GetAttributes

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

GetCreationTime GetLastAccessTime GetLastWriteTime Move Open

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

OpenRead OpenText OpenWrite SetAttributes SetCreationTime SetLastAccessTime

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.

Ly thng tin v tp tin


Ngoi lp File c cung cp t th vin c s, mt lp khc cng thng xuyn c s dng th lm vic vi tp tin l lp FileInfo. Chng trnh 12.6 minh ha vic

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);

Console.WriteLine(******************************); Console.WriteLine(Lastaccess:{0},fiFile.LastAccessTime); Console.WriteLine(Lastwrite:{0},fiFile.LastWriteTime); Console.WriteLine(Creation:{0},fiFile.CreationTime); } else { } Console.WriteLine({0}doesntexist!,fiFile.Name); } Console.WriteLine(******************************);

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 ******************************

----------------------------------------------------------------------------Mt i tng FileInfoc to ra v gn vi mt tp tin tng ng:


FileInfofiInfo=newFileInfo(CLA[1]);

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.

Lm vic vi tp tin d liu


Phn trc chng ta thc hin cng vic nh ly thng tin ca tp tin v sao chp tp tin sang mt tp tin mi. Vic thc hin quan trng ca tp tin l c v vit nhng thng tin t tp tin. Trong phn ny chng ta s tm hiu v lung nhp xut v cch to mi mt tp tin ghi hay m mt tp tin tn ti c thng tin.

Lung nhp xut


Thut ng tp tin th ni chung l lin quan n nhng thng tin lu tr bn trong a hoc trong b nh. Khi lm vic vi tp tin, chng ta bao hm vi vic s dng mt lung.

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

Cc phng thc cho vic to v m tp tin


C nhiu kiu lung khc nhau. Chng ta s s dng nhng lung khc nhau v nhng phng thc khc nhau ph thuc vo kiu d liu bn trong ca tp tin. Trong phn ny, vic c/ghi s c thc hin trn tp tin vn bn. Trong phn k tip chng ta hc cch c v vit thng tin trn tp tin nh phn. Thng tin nh phn bao hm kh nng mnh lu tr gi tr s v bt c kiu d liu no khc. m mt tp tin trn a cho vic c v vit tp tin vn bn, chng ta cn phi s dng c hai lp File v FileInfo. Mt vi phng thc c th s dng trong nhng lp ny. Cc phng thc ny bao gm:
AppendText

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

To mi mt tp tin To v m mt tp tin vn bn. To ra mt lung StreamWriter.

Open OpenRead OpenText OpenWrite

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,

cn nu chng ta t chc vic s dng tp tin nhiu ln bn trong chng trnh, tt

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.WriteLine(Daonuivalapbien); myFile.WriteLine(Quyetchiatlamnen); for(inti=0;i<10;i++) {

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

Data to be written Disk file arg[0] myFile - StreamWriter

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 {

stringbuffer; StreamReadermyFile=File.OpenText(args[0]); while((buffer=myFile.ReadLine())!=null) {Console.WriteLine(buffer); } myFile.Close(); } } } }

----------------------------------------------------------------------------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

Vit thng tin nh phn vo tp tin

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.

i tng th hin ca BinaryWrite l bwFilec to ra. myFile c truyn

vo b khi dng BinaryWrite, n s gn bwFilevi myFile.


for(inti=0;i<100;i++) { bwFile.Write(i);

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.

c thng tin nh phn t tp tin


Trong phn trc chng ta thc hin vic vit thng tin nh phn vo trong tp tin, v by gi chng ta mong mun c c cc thng tin ghi vo trong tp tin. Vic c thng tin cng kh n gin nh l vic vit vo. Chng trnh 12.10 sau minh ha cho cng vic ny. V d 12.10: c thng tin nh phn. ----------------------------------------------------------------------------//BinaryRead.cs:Docthongtintufilenhiphan namespace { usingSystem;using System.IO;public classTester { publicstaticvoidMain(String[]args) { if(args.Length<1) { Console.WriteLine(Phainhaptentaptin); } else { FileStreammyFile=newFileStream(args[0],FileMode.Open); BinaryReaderbrFile=newBinaryReader(myFile); //cdliu Console.WriteLine(Dangdoctaptin....); while(brFile.PeekChar()!=1) { Console.Write(<{0}>,brFile.ReadInt32()); Programming_CSharp

} 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

sau, lung ny s gip cho chng ta c thng tin nh phn:

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.

ReadDecimal ReadDouble ReadInt16 ReadInt32 ReadInt64 ReadSByte ReadSingle ReadString

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

Nhng i tng ngoi l To ring cc ngoi l Pht sinh li ngoi l Cu hi & bi tp

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.

Pht sinh v bt gi ngoi l


Trong ngn ng C#, chng ta ch c th pht sinh (throw) nhng i tng cc kiu d liu l System.Exception, hay nhng i tng c dn xut t kiu d liu ny. Namespace Systemca CLR cha mt s cc kiu d liu x l ngoi l m chng ta c th s dng trong chng trnh. Nhng kiu d liu ngoi l ny bao gm ArgumentNull
Exception, InValidCastException,

v OverflowException, cng nh nhiu lp khc na.

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().

Hm Func2() in ra thng ip u tin v pht sinh mt ngoi l kiu Vic thc

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...); }

catch { Console.WriteLine(Exceptioncaughtandhandled.); } Console.WriteLine(ExitFunc2...); } } }

----------------------------------------------------------------------------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...);

} publicvoidFunc2() { Console.WriteLine(EnterFunc2...);throw newSystem.Exception(); Console.WriteLine(ExitFunc2...); } } }

----------------------------------------------------------------------------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

chng ta thc hin chia vi zero. Trong ton hc vic ly zero

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

dn xut t ArithmeticException. Nu chng ta o th

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.

Trnh bin dch s nhn ra rng DivideByZeroException khng c

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

mc su nht trong chng trnh ca chng ta, phng thc A, B mc cao

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.

Nhng i tng ngoi l


Cho n lc ny th chng ta c th s dng tt cc ngoi l cng nh cch x l khc phc cc ngoi l ny. Trong phn ny chng ta s tin hnh vic tm hiu cc i tng c xy dng cho vic x l ngoi l. i tng System.Exception cung cp mt s cc phng thc v thuc tnh hu dng. Thuc tnh Message cung cp thng tin v ngoi l, nh l l do ti sao ngoi l c pht sinh. Thuc tnh Messagel thuc tnh ch c, on chng trnh pht sinh ngoi l c th thit lp thuc tnh Messagenh l mt i mc cho b khi dng ca ngoi l. Thuc tnh HelpLinkcung cp mt lin kt tr gip cho cc tp tin lin quan n cc ngoi l. y l thuc tnh ch c. Thuc tnh StackTracecng l thuc tnh ch c v c thit lp bi CLR. Trong v d 13.6 thuc tnh Exception.HelpLink c thit lp v truy cp cung cp thng tin cho ngi s dng v ngoi l DivideBy
ZeroException. stackcho

Thuc tnh StackTrace ca ngoi l c s dng cung cp thng tin

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

publicvoidTestFunc() { try { Console.WriteLine(Openfilehere); doublea=12; doubleb=0; 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);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

th gip chng ta hiu th t ca cc phng thc c gi.

Trong v d ny, hn l vic n gin pht sinh mt DidiveByZeroException, chng ta to mt th hn mi ca ngoi l:


DivideByZeroExceptione=newDivideByZeroException();

Chng ta khng truyn vo thng ip ca chng ta, nn thng ip mc nh s c in ra:


DivideByZeroException! Msg:Attempedtodividebyzero.

y chng ta c th b sung nh dng lnh bn di truyn vo thng ip ca chng ta ty chn nh sau:


newDivideByZeroException(Youtriedtodividebyzerowhichisnotmeaningful);

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;

Khi ngoi l c bt gi, chng trnh s in thng ip v HelpLinkra mn hnh:


catch(System.DivideByZeroExceptione) { Console.WriteLine(\nDivideByZeroException!Msg:{0},e.Message); Console.WriteLine(\nHelpLink:{0},e.HelpLink); }

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);

Kt qu l cc vt trong stacks c xut ra:


Heresastacktrace:

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.

InvalidCastException MulticastNotSupportedException NotFiniteNumberException NotSupportedException NullReferenceException OutOfMemoryException OverflowException StackOverflowException TypeInitializationException

Bng 13.1 : Cc ngoi l thng xut hin.

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.

Pht sinh li ngoi l


Gi s chng ta mun khi catch thc hin mt vi hnh ng ng no ri sau pht sinh li ngoi l ra bn ngoi khi catch(trong mt hm gi). Chng ta c php pht sinh li cng mt ngoi l hay pht sinh li cc ngoi l khc. Nu pht sinh ra ngoi l khc, chng ta c th phi nhng ngoi l ban u vo bn trong ngoi l mi phng thc gi c th hiu c lai lch v ngun gc ca ngoi l. Thuc tnh InnerExceptionca ngoi l mi cho php truy cp ngoi l ban u. Bi v InnerExceptioncng l mt ngoi l, nn n cng c mt ngoi l bn trong. Do vy, ton b dy chuyn ngoi l l mt s ng t (nest) ca mt ngoi l ny vi mt ngoi l khc. Ging nh l con lt t, mi con cha trong mt con v n lt con bn trong li cha... V d 13.8: Pht sinh li ngoi l & ngoi l inner.
namespace Programming_CSharp { usingSystem; //tongoilring publicclassMyCustomException:System.Exception { publicMyCustomException(stringmessage,Exceptioninner): base(message,inner) { } } publicclassTest {

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.

Chng trnh bt u vi vic gi hm DangerousFunc1() trong khi try:


try { DangerousFunc1(); } DangerousFunc1()

gi DangerousFunc2(), DangerousFunc2() li gi DangerousFunc3(), v cui

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 (

Khi catch trong DangerousFunc3() s bt cc ngoi l Arithmetic

nh l DivideByZeroException), n khng thc hin hnh ng no m ch n

gin l pht sinh li ngoi l:


catch(System.ArithmeticException) { throw; }

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()

bt gi ngoi l ny, lm mt s cng vic v to ra mt ngoi l mi c

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;

Khi khi catchca TestFuncthc hin n s in ra thng ip ca ngoi l :


E3CustomExceptionSituation!

sau tng ngoi l bn trong s c ly ra thng qua vng lp while:


while(inner!=null) {

Console.WriteLine({0},inner.Message); inner=inner.InnerException; }

Kt qu l chui cc ngoi l c pht sinh v c bt gi:


Retrievingexceptionhistory... E2Func2caughtdividebyzeroE1 DivideByZeroExceptionCu

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

so1=5; so2=5/so3; //xutktqu Console.WriteLine("So1:{0},So2:{1}",so1,so2); } }

----------------------------------------------------------------------------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 .

Dng Visual Studio .NET Xy Dng ng Dng Windows Form

389

You might also like