You are on page 1of 389

NGN NG

LP TRNH C#
NgnNgLpTrnhC#
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
Kiu lit k............................................................................................... 47
2
NgnNgLpTrnhC#
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
3
NgnNgLpTrnhC#
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
4
NgnNgLpTrnhC#
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
5
NgnNgLpTrnhC#
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
6
NgnNgLpTrnhC#
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 Verdana -10.
Cc t kha ca C# dng font Verdana-10, m hoc Verdana-10, bnh thng.
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.
7
NgnNgLpTrnhC#
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, 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.
Microsoft.NET
8
NgnNgLpTrnhC#
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 :
Q Khng h tr thit k hng i tng, nht l kh nng tha k (inheritance).
Q 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.
Q Kh nng x l li rt yu, khng thch hp trong mi trng Multi- tier
Q Kh dng chung vi ngn ng khc nh C++.
Q 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 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
Microsoft.NET
9
NgnNgLpTrnhC#
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 desktop n 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 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
Microsoft.NET
10
NgnNgLpTrnhC#
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:
Q 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).
Q 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.
Q 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.
Q 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.
Q 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:
Q 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.
Q 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.
Q 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.
Q cung cp mt mi trng thc thi m ngun m loi b c nhng li thc hin
cc script hay mi trng thng dch.
Q 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.
Microsoft.NET
11
NgnNgLpTrnhC#
Q 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.
Hnh 1.1: M t cc thnh phn trong .NET Framework.
Microsoft.NET
12
NgnNgLpTrnhC#
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.
Microsoft.NET
13
NgnNgLpTrnhC#
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
Microsoft.NET
14
NgnNgLpTrnhC#
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
Microsoft.NET
15
NgnNgLpTrnhC#
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
Microsoft.NET
16
NgnNgLpTrnhC#
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.
Microsoft.NET
17
NgnNgLpTrnhC#
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
C# l ngn ng mnh m v mm do
NgnNgC#
18
NgnNgLpTrnhC#
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++.
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
NgnNgC#
19
NgnNgLpTrnhC#
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 default foreach object sizeof unsafe
as delegate goto operator stackalloc ushort
base do if out static using
bool double implicit override string virtual
break else in params struct volatile
byte enum int private switch void
case event interface protected this while
catch explicit internal public throw
char extern is readonly true
checked false lock ref try
class finally long return typeof
const fixed namespace sbyte uint
continue float new sealed ulong
decimal for null short unchecked
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 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
NgnNgC#
20
NgnNgLpTrnhC#
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 ca
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
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).
NgnNgC#
21
NgnNgLpTrnhC#
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.
NgnNgC#
22
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
class ChaoMung
{
static void Main( )
{
// Xuat ra man hinh
System.Console.WriteLine(Chao Mung);
}
}
-----------------------------------------------------------------------------
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 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.
NgnNgC#
23
NgnNgLpTrnhC#
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 OK c 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 ChaoMung trn, 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 ca
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 void hay
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 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.
NgnNgC#
24
NgnNgLpTrnhC#
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 :
// Xuat ra man hinh.
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.
-----------------------------------------------------------------------------
class ChaoMung
{
static void Main()
{
/* Xuat ra man hinh chuoi chao mung
Su dung ham WriteLine cua lop System.Console
*/
System.Console.WriteLine(Chao Mung);
}
}
-----------------------------------------------------------------------------
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 tip.
NgnNgC#
25
NgnNgLpTrnhC#
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 khc nm
trong namespace ProgramCSharp.DataStructures, iu ny hon ton khng dn n s
tranh chp vi nhau.
NgnNgC#
26
NgnNgLpTrnhC#
Trong v d minh ha 1.2 i tng Console b 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 Collection
cn 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 :
using System;
u chng trnh v khi trong chng trnh nu chng ta c dng i tng Console th
khng cn phi vit y : System.Console. m ch cn vit Console. thi.
V d 2.3: Dng kha using
-----------------------------------------------------------------------------
using System;
class ChaoMung
{
static void Main()
{
//Xuat ra man hinh chuoi thong bao
Console.WriteLine(Chao Mung);
}
}
-----------------------------------------------------------------------------
NgnNgC#
27
NgnNgLpTrnhC#
Kt qu:
Chao Mung
-----------------------------------------------------------------------------
Lu rng phi t cu using System trc 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#.
-----------------------------------------------------------------------------
using System.Console;
class ChaoMung
{
static void Main()
{
//Xuat ra man hinh chuoi thong bao
WriteLine(Chao Mung);
}
}
-----------------------------------------------------------------------------
on chng trnh trn khi bin dch s c thng bo mt li nh sau:
error CS0138: A using namespace directive can only be applied to namespace;
System.Console is a class not a namespace.
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 writeLine th khc vi WriteLine v 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
php lc (camel notation) cho tn bin v c php Pascal cho hm, hng, v thuc tnh.
V d :
NgnNgC#
28
NgnNgLpTrnhC#
Bin myDictionary theo cch t tn c php lc .
Hm DrawLine, thuc tnh ColorBackground theo 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:
static void Main()
{
.......
}
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
c thit k.
S dng Notepad son tho
NgnNgC#
29
NgnNgLpTrnhC#
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: <file thc thi>] <file ngun>
V d: csc.exe /out:d:\chaomung.exe d:\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.
NgnNgC#
30
NgnNgLpTrnhC#
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
New Project s xut hin t ng m khng cn phi kch hot.
to ng dng, ta la chn mc Visual C# Projects trong ca s Project Type bn 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 OK khi 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.
NgnNgC#
31
NgnNgLpTrnhC#
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). Gi s
NgnNgC#
32
NgnNgLpTrnhC#
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 Solution Explorer).
Cui cng, Visual Studio .NET to mt khung sn chng trnh, v kt thc vi ch thch
TODO l v tr bt u ca chng ta. to chng trnh cho mng trong minh ha trn, ta
b tham s string[] args ca 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()
// Xuat ra man hinh
System.Console.WriteLine(Chao Mung);
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 Build Solution. 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
Cu hi 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 trn my tnh (nh CLR ca Microsoft) l c
th chy c chng trnh ca chng ta.
Cu hi 3: Sau khi to ra c tp tin thc thi .exe. C cn thit gi li tp tin ngun khng?
NgnNgC#
33
NgnNgLpTrnhC#
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
Cu hi 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
Cu hi 1: Hy a ra 3 l do ti sao ngn ng C# l mt ngn ng lp trnh tt?
Cu hi 2: IL v CLR vit tt cho t no v ngha ca n?
Cu hi 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?
Cu hi 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?
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?
Cu hi 9: Mt li tng t nh bn di thng xut hin khi no?
NgnNgC#
34
NgnNgLpTrnhC#
mycode.cs(15,5): error CS1010: NewLine in constan
Cu hi 10: Ti sao phi khai bo static cho hm Main ca 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?
-----------------------------------------------------------------------------
using System;
class variables
{
public static void Main()
{
int radius = 4;
const double PI = 3.14159;
double circum, area;
area = PI * radius* radius;
circum = 2 * PI * radius;
// in kt qu
Console.WriteLine(Ban kinh = {0}, PI = {1}, radius, PI);
Console.WriteLine(Dien tich {0}, area);
Console.WriteLine(Chu vi {0}, circum);
}
}
-----------------------------------------------------------------------------
Bi tp 3: Nhp vo chng trnh sau v bin dch. Cho bit chng trnh thc hin iu g?
-----------------------------------------------------------------------------
class AClass
NgnNgC#
35
NgnNgLpTrnhC#
{
static void Main()
{
int x, y;
for( x = 0; x < 10; x++, System.Console.Write(\n));
for( y = 0 ; y < 10; y++, System.Console.WriteLine({0},y));
}
}
-----------------------------------------------------------------------------
Bi tp 4: Chng trnh sau c cha li. Nhp vo v sa nhng li
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Bi tp 5: Sa li v bin dch chng trnh sau
-----------------------------------------------------------------------------
class Test
{
pubic static void Main()
{
Console.WriteLine(Xin chao);
Consoile.WriteLine(Tam biet);
}
}
-----------------------------------------------------------------------------
Bi tp 6: Sa li v bin dch chng trnh sau
-----------------------------------------------------------------------------
class Test
{
pubic void Main()
{
Console.WriteLine(Xin chao);
Consoile.WriteLine(Tam biet);
}
}
-----------------------------------------------------------------------------
Bi tp 7: Vit chng trnh xut ra bi th:
NgnNgC#
36
NgnNgLpTrnhC#
Rm Thng Ging
Rm xun lng lng trng soi,
Sng xun nc ln mu tri thm xun.
Gia dng bn bc vic qun
Khuya v bt ngt trng ngn y thuyn.
H Ch Minh.
NgnNgC#
37
NgnNgLpTrnhC#
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
NnTngNgnNgC#
38
NgnNgLpTrnhC#
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 int c kch thc l 4
byte) v kh nng ca n (nh mt i tng button c 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 stack nhng 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 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.
NnTngNgnNgC#
39
NgnNgLpTrnhC#
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
byte 1 Byte S nguyn dng khng du t 0-255
char 2 Char K t Unicode
bool 1 Boolean Gi tr logic true/ false
sbyte 1 Sbyte S nguyn c du ( t -128 n 127)
short 2 Int16 S nguyn c du gi tr t -32768 n
32767.
ushort 2 Unt16 S nguyn khng du 0 65.535
int 4 Int32 S nguyn c du 2.147.483.647 v
2.147.483.647
uint 4 Uint32 S nguyn khng du 0 4.294.967.295
float 4 Single Kiu du chm ng, gi tr xp x t 3,4E-
38 n 3,4E+38, vi 7 ch s c ngha..
double 8 Double Kiu du chm ng c chnh xc gp
i, gi tr xp x t 1,7E-308 n 1,7E+308,
vi 15,16 ch s c ngha.
decimal 8 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
theo sau gi tr.
NnTngNgnNgC#
40
NgnNgLpTrnhC#
long 8 Int64 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
ulong 8 Uint64 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 true hay 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 false v cc gi tr cn li l true.
Chn kiu d liu
Thng thng chn mt kiu d liu nguyn s dng nh short, int hay long
thng da vo ln ca gi tr mun s dng. V d, mt bin ushort c 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
NnTngNgnNgC#
41
NgnNgLpTrnhC#
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 stack c 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 float l thch hp nht. Tuy nhin lu
rng trnh bin dch lun lun hiu bt c mt s thc no cng l mt s kiu double tr khi
chng ta khai bo r rng. gn mt s kiu float th s phi c k t f theo sau.
float soFloat = 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 ngha
\ Du nhy n
\ Du nhy kp
\\ Du cho
\0 K t null
\a Alert
NnTngNgnNgC#
42
NgnNgLpTrnhC#
\b Backspace
\f Sang trang form feed
\n Dng mi
\r u dng
\t Tab ngang
\v 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 short cng thuc v int:
short x = 10;
int y = x; // chuyn i ngm nh
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 int sang s kiu short:
short x;
int y = 100;
x = y; // Khng bin dch, li !!!
khng b li chng ta phi dng lnh gn tng minh, on m trn c vit li nh sau:
short x;
int y = 500;
x = (short) y; // p kiu tng minh, trnh bin dch khng bo li
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. 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.
-----------------------------------------------------------------------------
NnTngNgnNgC#
43
NgnNgLpTrnhC#
class MinhHoaC3
{
static void Main()
{
int bien1 = 9;
System.Console.WriteLine(Sau khi khoi tao: bien1 ={0}, bien1);
bien1 = 15;
System.Console.WriteLine(Sau khi gan: 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:
int bien1;
v gi nguyn phn cn li ta c v d 3.2:
V d 3.2: S dng mt bin khng khi to.
-----------------------------------------------------------------------------
class MinhHoaC3
{
static void Main()
{
int bien1;
System.Console.WriteLine(Sau khi khoi tao: bien1 ={0}, bien1);
bien1 = 15;
System.Console.WriteLine(Sau khi gan: bien1 ={0}, bien1);
}
}
-----------------------------------------------------------------------------
Khi bin dch on chng trnh trn th trnh bin dch C# s thng bo mt li sau:
...error CS0165: Use of unassigned local variable bien1
NnTngNgnNgC#
44
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
class MinhHoaC3
{
static void Main()
{
int bien1;
bien1 = 9;
System.Console.WriteLine(Sau khi khoi tao: bien1 ={0}, bien1);
bien1 = 15;
System.Console.WriteLine(Sau khi gan: 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
c.
Biu tng hng: gn mt tn cho mt gi tr hng, to mt biu tng hng dng t kha
const v c php sau:
<const> <type> <tn hng> = <gi tr>;
NnTngNgnNgC#
45
NgnNgLpTrnhC#
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:
const int DoSoi = 100;
Trong khai bo trn, 32 l mt hng s v DoSoi l 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.
-----------------------------------------------------------------------------
class MinhHoaC3
{
static void Main()
{
const int DoSoi = 100; // C
const int DoDong = 0; // C
System.Console.WriteLine( Do dong cua nuoc {0}, DoDong );
System.Console.WriteLine( Do soi cua nuoc {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: DoSoi v 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
...
class MinhHoaC3
{
static void Main()
{
const int DoSoi = 100; // C
const int DoDong = 0; // C
System.Console.WriteLine( Do dong cua nuoc {0}, DoDong );
NnTngNgnNgC#
46
NgnNgLpTrnhC#
System.Console.WriteLine( Do soi cua nuoc {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:
const int DoDong = 0;
const int DoSoi = 100;
Do mc ch m rng ta mong mun thm mt s hng s khc vo danh sch trn, nh cc
hng sau:
const int DoNong = 60;
const int DoAm = 40;
const int DoNguoi = 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:
enum NhietDoNuoc
{
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:
[thuc tnh] [b sung] enum <tn lit k> [:kiu c s] {danh sch cc thnh phn
lit k};
Thnh phn thuc tnh v b sung l t chn s c trnh by trong phn sau ca sch.
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:
NnTngNgnNgC#
47
NgnNgLpTrnhC#
enum NhietDoNuoc
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 ushort hay 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:
enum KichThuoc :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.
-----------------------------------------------------------------------------
class MinhHoaC3
{
// Khai bo kiu lit k
enum NhietDoNuoc
{
DoDong = 0,
DoNguoi = 20,
DoAm = 40,
DoNong = 60,
DoSoi = 100,
}
static void Main()
{
System.Console.WriteLine( Nhiet do dong: {0}, NhietDoNuoc.DoDong);
System.Console.WriteLine( Nhiet do nguoi: {0}, NhietDoNuoc.DoNguoi);
System.Console.WriteLine( Nhiet do am: {0}, NhietDoNuoc.DoAm);
System.Console.WriteLine( Nhiet do nong: {0}, NhietDoNuoc.DoNong);
System.Console.WriteLine( Nhiet do soi: {0}, NhietDoNuoc.DoSoi);
}
}
-----------------------------------------------------------------------------
Kt qu:
NnTngNgnNgC#
48
NgnNgLpTrnhC#
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:
enum Thutu
{
ThuNhat,
ThuHai,
ThuBa = 10,
ThuTu
}
Khi gi tr ca ThuNhat l 0, gi tr ca ThuHai l 1, gi tr ca ThuBa l 10 v gi tr ca
ThuTu l 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:
int x = (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:
string chuoi;
Mt hng chui c to bng cch t cc chui trong du nhy i:
Xin chao
y l cch chung khi to mt chui k t vi gi tr hng:
string chuoi = Xin chao
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, 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.
NnTngNgnNgC#
49
NgnNgLpTrnhC#
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 class hay int c. Ngoi ra, C# cng phn bit cc k t thng v k t
hoa v vy C# xem hai bin bienNguyen v bienguyen l 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 = 24 l 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 var1 s nhn c gi tr l 24 v
tip sau th var2 cng 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(Xin chao!);
mi khong trng gia hai ch Xin v chao u c i x bnh thng nh cc k t
khc trong chui.
NnTngNgnNgC#
50
NgnNgLpTrnhC#
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:
int x = 24;
tng t nh:
int x=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:
int x; // mt cu lnh
x = 32; // cu lnh khc
int y =x; // y cng l mt cu lnh
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 each s 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.
Q Gi hm
NnTngNgnNgC#
51
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
class GoiHam
{
static void Main()
{
Console.WriteLine( Ham Main chuan bi goi ham Func()... );
Func();
Console.WriteLine( Tro lai ham Main() );
}
static void Func()
{
Console.WriteLine( ---->Toi la ham Func()...);
}
}
-----------------------------------------------------------------------------
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 Main v
thc hin cu lnh ngay sau cu lnh gi hm Func.
Q T kho phn nhnh khng iu kin
thc hin phn nhnh ta gi mt trong cc t kha sau: goto, break, continue, return,
statementthrow. 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.
NnTngNgnNgC#
52
NgnNgLpTrnhC#
Q 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 if c thc hin.
Trong cu iu kin if...else th else l phn ty chn. Cc cu lnh bn trong thn ca else
ch c thc hin khi iu kin ca if l sai. Do vy khi cu lnh y if...else c dng
th ch c mt trong hai if hoc else c thc hin. Ta c c php cu iu kin if... else
sau:
if (biu thc iu kin)
<Khi lnh thc hin khi iu kin ng>
[else
<Khi lnh thc hin khi iu kin sai>]
Nu cc cu lnh trong thn ca if hay else m ln hn mt lnh th cc lnh ny phi c
bao trong mt khi lnh, tc l phi nm trong du khi { }:
if (biu thc iu kin)
{
<lnh 1>
<lnh 2>
....
}
[else
{
<lnh 1>
<lnh 2>
...
}]
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.
-----------------------------------------------------------------------------
using System;
class ExIfElse
{
static void Main()
{
int var1 = 10;
int var2 = 20;
if ( var1 > var2)
NnTngNgnNgC#
53
NgnNgLpTrnhC#
{
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( Gan gia tri var1 cho var2);
Console.WriteLine( Tang bien var1 len mot );
Console.WritelLine( Var1 = {0}, var2 = {1}, var1, var2);
}
else
{
var1 = var2;
Console.WriteLine( Thiet lap gia tri var1 = 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 else s c thc hin, v cc lnh ny in ra mn hnh:
var2: 20 > var1: 10
NnTngNgnNgC#
54
NgnNgLpTrnhC#
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:
Gan gia tri var1 cho var2
Tang bien var1 len mot
Var1 = 31, var2 = 30
Q Cu lnh if lng 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 if lng nhau.
-----------------------------------------------------------------------------
using System;
class TinhTrangKetHon
{
static void Main()
{
int tuoi;
bool coGiaDinh; // 0: cha c gia nh; 1: c gia nh
bool gioiTinh; // 0: gii tnh n; 1: gii tnh nam
tuoi = 24;
coGiaDinh = false; // cha c gia nh
gioiTinh = true; // nam
if ( tuoi >= 19)
{
if ( coGiaDinh == false)
{
if ( gioiTinh == false) // nu
Console.WriteLine( Nu co the ket hon);
else // nam
NnTngNgnNgC#
55
NgnNgLpTrnhC#
if (tuoi >19) // phi ln hn 19 tuoi mi c kt hn
Console.WriteLine( Nam co the ket hon);
}
else // da co gia dinh
Console.WriteLine( Khong the ket hon nua do da ket hon);
}
else // tuoi < 19
Console.WriteLine( Khong du tuoi ket hon );
}
}
-----------------------------------------------------------------------------
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 if th ba c thc hin v
xut ra kt qu : Nam co the ket hon.
Q Cu lnh switch
Khi c qu nhiu iu kin chn thc hin th dng cu lnh if s rt ri rm v di
dng, Cc ngn ng lp trnh cp cao u cung cp mt dng cu lnh switch lit k cc gi
tr v ch thc hin cc gi tr thch hp. C# cng cung cp cu lnh nhy switch c c php
sau:
switch (biu thc iu kin)
{
case <gi tr>:
<Cc cu lnh thc hin>
<lnh nhy>
[default:
<Cc cu lnh thc hin mc nh>]
}
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.
NnTngNgnNgC#
56
NgnNgLpTrnhC#
Nu mt cu lnh case c thch hp tc l gi tr sau case bng 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 case theo sau.
d hiu hn ta s xem xt v d 3.9 di y.
V d 3.9: Cu lnh switch.
-----------------------------------------------------------------------------
using System;
class MinhHoaSwitch
{
static void Main()
{
const int mauDo = 0;
const int mauCam = 1;
const int mauVang = 2;
const int mauLuc = 3;
const int mauLam = 4;
const int mauCham = 5;
const int mauTim = 6;
int chonMau = mauLuc;
switch ( chonMau )
{
case mauDo:
Console.WriteLine( Ban cho mau do );
break;
case mauCam:
Console.WriteLine( Ban cho mau cam );
break;
case mauVang:
//Console.WriteLine( Ban chon mau vang);
case mauLuc:
Console.WriteLine( Ban chon mau luc);
break;
case mauLam:
Console.WriteLine( Ban chon mau lam);
goto case mauCham;
case mauCham:
NnTngNgnNgC#
57
NgnNgLpTrnhC#
Console.WriteLine( Ban cho mau cham);
goto case mauTim;
case mauTim:
Console.WriteLine( Ban chon mau tim);
goto case mauLuc;
default:
Console.WriteLine( Ban khong chon mau nao het);
break;
}
Console.WriteLine( Xin cam on!);
}
}
-----------------------------------------------------------------------------
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 Cu lnh case thc hin Kt qu thc hin
mauDo case mauDo Ban chon mau do
mauCam case mauCam Ban chon mau cam
mauVang case mauVang
case mauLuc
Ban chon mau luc
mauLuc case mauLuc Ban chon mau luc
mauLam case mauLam
case mauCham
case mauTim
case mauLuc
Ban chon mau lam
Ban chon mau cham
Ban chon mau tim
Ban chon mau luc
mauCham case mauCham
case mauTim
case mauLuc
Ban chon mau cham
Ban chon mau tim
Ban chon mau luc
mauTim case mauTim
case mauLuc
Ban chon mau tim
Ban chon mau luc
Bng 3.3: M t cc trng hp thc hin cu lnh switch.
Trong on v d do gi tr ca bin chonMau = mauLuc nn khi vo lnh switch th case
mauLuc s c thc hin v kt qu nh sau:
-----------------------------------------------------------------------------
Kt qu v d 3.9
NnTngNgnNgC#
58
NgnNgLpTrnhC#
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:
case 1: // nhy xung
case 2:
Nh minh ha trn th trng hp x l case 1 l rng, tuy nhin chng ta khng th vit
nh sau:
case 1:
DoAnything();
// Trng hp ny khng th nhy xung case 2
case 2:
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 goto
mt cc tng minh:
case 1:
DoAnything();
goto case 2;
case 2:
Do vy khi thc hin xong cc cu lnh ca mt trng hp nu mun thc hin mt trng
hp case khc th ta dng cu lnh nhy goto vi nhn ca trng hp :
goto case <gi tr>
Khi gp lnh thot break th chng trnh thot khi switch v thc hin lnh tip sau khi
switch .
Nu khng c trng hp no thch hp v trong cu lnh switch c dng cu lnh defalut
th cc cu lnh ca trng hp default s c thc hin. Ta c th dng default cnh
bo mt li hay x l mt trng hp ngoi tt c cc trng hp case trong switch.
Trong v d minh ha cu lnh switch trc 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
switch vi gi tr l mt chui, c th vit nh sau:
switch (chuoi1)
{
case mau do:
....
break;
case mau cam:
NnTngNgnNgC#
59
NgnNgLpTrnhC#
...
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.
Q Cu lnh nhy goto
Lnh nhy goto l 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
goto n 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.
-----------------------------------------------------------------------------
using System;
public class UsingGoto
{
public static int Main()
{
int i = 0;
lap: // nhn
Console.WriteLine(i:{0},i);
i++;
if ( i < 10 )
goto lap; // nhy v nhn lap
return 0;
}
}
-----------------------------------------------------------------------------
NnTngNgnNgC#
60
NgnNgLpTrnhC#
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.
Q Vng lp while
ngha ca vng lp while l: Trong khi iu kin ng th thc hin cc cng vic ny.
C php s dng vng lp while nh sau:
while (Biu thc)
<Cu lnh thc hin>
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.
-----------------------------------------------------------------------------
using System;
public class UsingWhile
{
public static int Main()
{
int i = 0;
while ( i < 10 )
{
Console.WriteLine( i: {0} ,i);
i++;
NnTngNgnNgC#
61
NgnNgLpTrnhC#
}
return 0;
}
}
-----------------------------------------------------------------------------
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 i c gi tr l 11, th vng lp s khng c thc hin.
Q Vng lp do...while
i khi vng lp while khng tho mn yu cu trong tnh hung sau, chng ta mun chuyn
ng ngha ca while l 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...while nh
sau:
do
<Cu lnh thc hin>
while ( iu kin )
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.
NnTngNgnNgC#
62
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
using System;
public class UsingDoWhile
{
public static int Main( )
{
int i = 11;
do
{
Console.WriteLine(i: {0},i);
i++;
} while ( i < 10 )
return 0;
}
}
-----------------------------------------------------------------------------
Kt qu:
i: 11
-----------------------------------------------------------------------------
Do khi to bin i gi tr l 11, nn iu kin ca while l sai, tuy nhin vng lp do...while
vn c thc hin mt ln.
Q Vng lp for
Vng lp for bao 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 for nh sau:
for ([ phn khi to] ; [biu thc iu kin]; [bc lp])
<Cu lnh thc hin>
Vng lp for c minh ha trong v d sau:
V d 3.13: S dng vng lp for.
-----------------------------------------------------------------------------
using System;
public class UsingFor
{
public static int Main()
{
for (int i = 0; i < 30; i++)
NnTngNgnNgC#
63
NgnNgLpTrnhC#
{
if (i %10 ==0)
{
Console.WriteLine({0} ,i);
}
else
{
Console.Write({0} ,i);
}
}
return 0;
}
}
-----------------------------------------------------------------------------
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 i v 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 for s c thc
hin. Sau khi thc hin xong th bin i s c tng thm mt n v (i++).
C mt iu lu l bin i do khai bao bn trong vng lp for nn 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.
-----------------------------------------------------------------------------
using System;
public class UsingFor
{
public static int Main()
{
for (int i = 0; i < 30; i++)
{
NnTngNgnNgC#
64
NgnNgLpTrnhC#
if (i %10 ==0)
{
Console.WriteLine({0} ,i);
}
else
{
Console.Write({0} ,i);
}
}
// Lnh sau sai do bin i ch c khai bo bn trong vng lp
Console.WriteLine( Ket qua cuoi cung cua i:{0},i);
return 0;
}
}
-----------------------------------------------------------------------------
Q Cu lnh lp foreach
Vng lp foreach cho 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 ( <kiu tp hp> <tn truy cp thnh phn > in < tn tp hp>)
<Cc cu lnh thc hin>
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.
-----------------------------------------------------------------------------
using System;
public class UsingForeach
{
public static int Main()
{
int[] intArray = {1,2,3,4,5,6,7,8,9,10};
foreach( int item in intArray)
{
Console.Write({0} , item);
}
return 0;
}
NnTngNgnNgC#
65
NgnNgLpTrnhC#
}
-----------------------------------------------------------------------------
Kt qu:
1 2 3 4 5 6 7 8 9 10
-----------------------------------------------------------------------------
Q Cu lnh nhy break v 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 break v continue thot khi vng lp.
Break khi c s dng s a chng trnh thot khi vng lp v tip tc thc hin cc
lnh tip ngay sau vng lp.
Continue ngng thc hin cc cng vic cn li ca vng lp hin thi v quay v u vng
lp thc hin bc lp tip theo
Hai lnh break v continue to 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 break v continue.
-----------------------------------------------------------------------------
using System;
public class TrafficSignal
{
public static int Main()
{
string signal = 0; // Khi to tn hiu
// bt u chu trnh x l tn hiu
while ( signal != X)
NnTngNgnNgC#
66
NgnNgLpTrnhC#
{
//nhp tn hiu
Console.Write(Nhap vao mot tin hieu: );
signal = Console.ReadLine();
// xut tn hiu hin thi
Console.WriteLine(Tin hieu nhan duoc: {0}, signal);
// phn x l tn hiu
if (signal == T)
{
// Tn hiu thot c gi
// lu li s kin v thot
Console.WriteLine(Ngung xu ly! Thoat\n);
break;
}
if ( signal == 0)
{
// Tn hiu nhn c bnh thng
// Lu li s kin v tip tc
Console.WriteLine(Tat ca dieu tot!\n);
continue;
}
// Thc hin mt s hnh ng no
// v tip tc
Console.WriteLine(---bip bip bip\n);
}
return 0;
}
}
-----------------------------------------------------------------------------
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
NnTngNgnNgC#
67
NgnNgLpTrnhC#
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.
Q 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 decimal th kt qu chia c
tr v l mt s thc.
Q 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%3 th 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
NnTngNgnNgC#
68
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
class Tester
{
public static void Main()
{
int i1, i2;
float f1, f2;
double d1, d2;
decimal dec1, 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
NnTngNgnNgC#
69
NgnNgLpTrnhC#
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 .
Q 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 = Luong 100.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
-= Ton hng bn tri c tr bt i mt
lng bng gi tr ca ton hng bn
phi
*= Ton hng bn tri c nhn vi mt
lng bng gi tr ca ton hng bn
phi.
/= Ton hng bn tri c chia vi mt
lng bng gi tr ca ton hng bn
phi.
%= Ton hng bn tri c chia ly d vi
mt lng bng gi tr ca ton hng
bn phi.
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:
NnTngNgnNgC#
70
NgnNgLpTrnhC#
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 Luong nhn 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++;
Q 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,
var2 l 11, hay var1 l 11, var2 cng 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++; // Hu t
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 var1 v var2 iu 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.
-----------------------------------------------------------------------------
using System;
class Tester
{
static int Main()
{
int valueOne = 10;
int valueTwo;
valueTwo = valueOne++;
Console.WriteLine(Thuc hien tang sau: {0}, {1},
valueOne, valueTwo);
valueOne = 20;
NnTngNgnNgC#
71
NgnNgLpTrnhC#
valueTwo = ++valueOne;
Console.WriteLine(Thuc hien tang truoc: {0}, {1},
valueOne, valueTwo);
return 0;
}
}
-----------------------------------------------------------------------------
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 (true hay 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 > 2 tr
v mt gi tr l true, trong khi 2 > 5 tr 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
value2 c gi tr l 50.
Tn ton t K hiu Biu thc so snh Kt qu so snh
So snh bng == value1 == 100
value1 == 50
true
false
Khng bng != value2 != 100
value2 != 90
false
true
Ln hn > value1 > value2
value2 > value1
true
false
Ln hn hay bng >= value2 >= 50 true
Nh hn < value1 < value2
value2 < value1
false
true
Nh hn hay bng <= value1 <= value2 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
NnTngNgnNgC#
72
NgnNgLpTrnhC#
Trong cu lnh if m chng ta tm hiu trong phn trc, th khi iu kin l true
th biu thc bn trong if mi 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 y trong
x c gi tr l 5 v y c gi tr l 7.
Tn ton t K hiu Biu thc logic Gi tr Logic
and && (x == 3) && (y ==
7)
false C hai iu kin
phi ng
or || (x == 3) || (y == 7) true Ch cn mt iu
kin ng
not ! ! (x == 3 ) true Biu thc trong
ngoc phi sai.
Bng 3.5: Cc ton t logic (gi s x = 5, y = 7).
Ton t and s 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 and th 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:
int x = 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 x l 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 if vn sai.
NnTngNgnNgC#
73
NgnNgLpTrnhC#
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 or ch cn mt iu kin ng l :
int x =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*3 cho kt qu l 26 ng 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 var1 s 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 36 cho bin var1 c 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 Loi ton t Ton t Th t
1 Php ton c bn (x) x.y f(x) a[x] x++ xnew typeof
sizeof checked unchecked
Tri
2 + - ! ~ ++x x (T)x Tri
3 Php nhn * / % Tri
4 Php cng + - Tri
5 Dch bit << >> Tri
6 Quan h < > <= >= is Tri
NnTngNgnNgC#
74
NgnNgLpTrnhC#
7 So snh bng == != Phi
8 Php ton logic
AND
& Tri
9 Php ton logic
XOR
^ Tri
10 Php ton logic OR | Tri
11 iu kin AND && Tri
12 iu kin OR || Tri
13 iu kin ?: Phi
14 Php gn = *= /= %= += -= <<= >>= &=
^= |=
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:
<Biu thc iu kin > ? <Biu thc th 1> : <Biu thc th 2>
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.
-----------------------------------------------------------------------------
using System;
class Tester
{
public static int Main()
{
int value1;
NnTngNgnNgC#
75
NgnNgLpTrnhC#
int value2;
int maxValue;
value1 = 10;
value2 = 20;
maxValue = value1 > value2 ? value1 : value2;
Console.WriteLine(Gia tri thu nhat {0}, gia tri thu hai {1},
gia tri lon nhat {2}, value1, value2, maxValue);
return 0;
}
}
-----------------------------------------------------------------------------
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 value2 cho 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 < Tn namespace >
to mt namespace dng c php sau:
namespace <Tn namespace>
{
< nh ngha lp A>
< nh ngha lp B >
.....
}
on v d 3.20 minh ha vic to mt namespace.
V d 3.20: To mt namespace.
-----------------------------------------------------------------------------
NnTngNgnNgC#
76
NgnNgLpTrnhC#
namespace MyLib
{
using System;
public class Tester
{
public static int Main()
{
for (int i =0; i < 10; i++)
{
Console.WriteLine( i: {0}, i);
}
return 0;
}
}
}
-----------------------------------------------------------------------------
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.
-----------------------------------------------------------------------------
namespace MyLib
{
namespace Demo
{
using System;
public class Tester
{
public static int Main()
{
for (int i =0; i < 10; i++)
{
Console.WriteLine( i: {0}, i);
}
return 0;
}
}
NnTngNgnNgC#
77
NgnNgLpTrnhC#
}
}
-----------------------------------------------------------------------------
Lp Tester trong v d 3.21 c t trong namespace Demo do c th to mt lp Tester
khc bn ngoi namespace Demo hay bn ngoi namespace MyLib m khng c bt c s
tranh cp hay xung t no. truy cp lp Tester dng 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.
-----------------------------------------------------------------------------
using System;
namespace MyLib
{
namespace Demo1
{
class Example1
{
public static void Show1()
{
Console.WriteLine(Lop Example1);
}
}
}
namespace Demo2
{
public class Tester
{
public static int Main()
{
Demo1.Example1.Show1();
Demo1.Example2.Show2();
return 0;
}
}
}
}
// Lp Example2 c cng namespace MyLib.Demo1 vi
NnTngNgnNgC#
78
NgnNgLpTrnhC#
//lp Example1 nhng hai khai bo khng cng mt khi.
namespace MyLib.Demo1
{
class Example2
{
public static void Show2()
{
Console.WriteLine(Lop Example2);
}
}
}
-----------------------------------------------------------------------------
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 MyLib c hai namespace con cng cp l
Demo1 v Demo2, hm Main ca Demo2 s c chng trnh thc hin, v trong hm Main
ny c gi hai hm thnh vin tnh ca hai lp Example1 v Example2 ca namespace
Demo1.
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:
namespace MyLib.Demo1
{
class Example2
{
....
}
}
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
NnTngNgnNgC#
79
NgnNgLpTrnhC#
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:
#define DEBUG
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 <nh danh>. Do ta
c th vit nh sau:
#define DEBUG
//...Cc on m ngun bnh thng, khng b tc ng bi trnh tin x l
...
#if DEBUG
// Cc on m ngun trong khi if debug c bin dch
#else
// Cc on m ngun khng nh ngha debug v khng c bin dch
#endif
//...Cc on m ngun bnh thng, khng b tc ng bi trnh tin x l
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 #if s 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 #if v #endif th khng b tc ng bi trnh
tin x l v tt c cc m ny u c a vo bin dch.
NnTngNgnNgC#
80
NgnNgLpTrnhC#
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 #undef nh danh hay n cui chng trnh:
#define DEBUG
#if DEBUG
// on code ny c bin dch
#endif
....
#undef DEBUG
....
#if DEBUG
// on code ny khng c bin dch
#endif
.....
#if u tin ng do DEBUG c nh ngha, cn #if th hai sai khng c bin dch v
DEBUG c nh ngha li l #undef.
Ngoi ra cn c ch th #elif v #else cung cp cc ch dn phc tp hn. Ch dn #elif cho
php s dng logic else-if. 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:
....
#if DEBUG
// on code ny c bin dch nu DEBUG c nh ngha
#elif TEST
//on code ny c bin dch nu DEBUG khng c nh ngha
// v TEST c nh ngha
#else
//on code ny c bin dch nu c DEBUG v
//TEST khng c nh ngha.
#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 #if v #elif s c bin dch, v
tt c cc phn cn li cho n ch th #endif u khng c bin dch. Nu DEBUG khng
c nh ngha th #elif s kim tra nh danh TEST, on m gia #elif v #else s c
NnTngNgnNgC#
81
NgnNgLpTrnhC#
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 #else v #endif s 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.
Cu hi 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.
Cu hi 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.
Cu hi 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.
Cu hi 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
Cu hi 1: C bao nhiu cch khai bo comment trong ngn ng C#, cho bit chi tit?
NnTngNgnNgC#
82
NgnNgLpTrnhC#
Cu hi 2: Nhng t theo sau t no l t kha trong C#: field, cast, as, object, throw,
football, do, get, set, basketball.
Cu hi 3: Nhng khi nim chnh ca ngn ng lp trnh hng i tng?
Cu hi 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?
Cu hi 6: Kiu chui trong C# l kiu d liu no?
Cu hi 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?
Cu hi 8: S khc nhau gia kiu unsigned v signed trong kiu s nguyn?
Cu hi 9: Kiu d liu no nh nht c th lu tr c gi tr 45?
Cu hi 10: S ln nht, v nh nht ca kiu int l s no?
Cu hi 11: C bao nhiu bit trong mt byte?
Cu hi 12: Kiu d liu no trong .NET tng ng vi kiu int trong C#?
Cu hi 13: Nhng t kha no lm thay i lung ca chng trnh?
Cu hi 14: Kt qu ca 15%4 l bao nhiu?
Cu hi 15: S khc nhau gia chuyn i tng minh v chuyn i ngm nh?
Cu hi 16: C th chuyn t mt gi tr long sang gi tr int hay khng?
Cu hi 17: S ln ti thiu cc lnh trong while c thc hin?
Cu hi 18: S ln ti thiu cc lnh trong do while c thc hin?
Cu hi 19: Lnh no dng thot ra khi vng lp?
Cu hi 20: Lnh no dng qua vng lp k tip?
Cu hi 21: Khi no dng bin v khi no dng hng?
Cu hi 22: Cho bit gi tr CanhCut trong kiu lit k sau:
enum LoaiChim
{
HaiAu,
BoiCa,
DaiBang = 50,
CanhCut
}
Cu hi 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?
-----------------------------------------------------------------------------
NnTngNgnNgC#
83
NgnNgLpTrnhC#
class BaiTap3_1
{
public static void Main()
{
int x = 0;
for(x = 1; x < 10; x++)
{
System.Console.Write({0:03}, x);
}
}
}
-----------------------------------------------------------------------------
Bi tp 2: Tm li ca chng trnh sau? sa li v bin dch chng trnh.
-----------------------------------------------------------------------------
class BaiTap3_2
{
public static void Main()
{
for(int i=0; i < 10 ; i++)
System.Console.WriteLine(so :{1}, i);
}
}
-----------------------------------------------------------------------------
Bi tp 3: Tm li ca chng trnh sau. Sa li v bin dch li chng trnh.
-----------------------------------------------------------------------------
using System;
class BaiTap3_3
{
public static void Main()
{
double myDouble;
decimal myDecimal;
myDouble = 3.14;
myDecimal = 3.14;
Console.WriteLine(My Double: {0}, myDouble);
Console.WriteLine(My Decimal: {0}, myDecimal);
}
}
NnTngNgnNgC#
84
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
Bi tp 4: Tm li ca chng trnh sau. Sa li v bin dch li chng trnh.
-----------------------------------------------------------------------------
class BaiTap3_4
{
static void Main()
{
int value;
if (value > 100);
System.Console.WriteLine(Number is greater than 100);
}
}
-----------------------------------------------------------------------------
Bi tp 5: Vit chng trnh hin th ra mn hnh 3 kiu sau:
*
* *
* * *
* * * *
* * * * *
* * * * * *
a)
$ $ $ $ $ $
$ $ $ $ $
$ $ $ $
$ $ $
$ $
$
b)
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
c)
Bi tp 6: Vit chng trnh hin ra trn mn hnh.
NnTngNgnNgC#
85
NgnNgLpTrnhC#
1
2 3 2
3 4 5 4 3
4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
6 7 8 9 0 1 0 9 8 7 6
7 8 9 0 1 2 3 2 1 0 9 8 7
8 9 0 1 2 3 4 5 4 3 2 1 0 9 8
9 0 1 2 3 4 5 6 7 6 5 4 3 2 1 0 9
0 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 0
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 tp 9: 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.
NnTngNgnNgC#
86
NgnNgLpTrnhC#
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, long and
char. Tuy nhin tri tim v linh hn ca C# l kh nng to ra nhng kiu d liu mi, phc
XyDngLp-iTng
87
NgnNgLpTrnhC#
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.
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:
[Thuc tnh] [B sung truy cp] class <nh danh lp> [: Lp c s]
{
XyDngLp-iTng
88
NgnNgLpTrnhC#
<Phn thn ca lp: bao gm nh ngha cc thuc tnh v
phng thc hnh ng >
}
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()):
public class Tester
{
public static int Main()
{
//....
}
}
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:
int var1 = 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 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,...
XyDngLp-iTng
89
NgnNgLpTrnhC#
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 :
ListBox myListBox;
Mt khi chng ta to mt th hin ca lp ListBox th 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.
-----------------------------------------------------------------------------
using System;
public class ThoiGian
{
public void ThoiGianHienHanh()
{
Console.WriteLine(Hien thi thoi gian hien hanh);
}
// Cc bin thnh vin
int Nam;
int Thang;
int Ngay;
int Gio;
int Phut;
int Giay;
}
public class Tester
{
static void Main()
{
ThoiGian t = new ThoiGian();
t.ThoiGianHienHanh();
}
}
XyDngLp-iTng
90
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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 Gii hn truy cp
public Khng hn ch. Nhng thnh vin c nh du
public c th c dng bi bt k cc phng thc ca
lp bao gm nhng lp khc.
private Thnh vin trong mt lp A c nh du l private
th ch c truy cp bi cc phng thc ca lp A.
protected 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.
internal Thnh vin trong lp A c nh du l internal th
c truy cp bi nhng phng thc ca bt c lp
no trong cng khi hp ng vi A.
protected internal Thnh vin trong lp A c nh du l protected
internal c truy cp bi cc phng thc ca lp A,
cc phng thc ca lp dn xut ca A, v bt c lp
no trong cng khi hp ng ca A.
XyDngLp-iTng
91
NgnNgLpTrnhC#
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:
// Cc bin thnh vin private
int Nam;
int Thang;
int Ngay;
int Gio;
int Phut;
int Giay;
Do lp Tester v phng thc thnh vin ThoiGianHienHanh ca lp ThoiGian c khai
bo l public nn 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 private mc 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 int v button:
void Method( int param1, button param2)
{
//...
}
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 int v float.
V d 4.2: Truyn tham s cho phng thc.
-----------------------------------------------------------------------------
XyDngLp-iTng
92
NgnNgLpTrnhC#
using System;
public class Class1
{
public void SomeMethod(int p1, float p2)
{
Console.WriteLine(Ham nhan duoc hai tham so: {0} va {1},
p1,p2);
}
}
public class Tester
{
static void Main()
{
int var1 = 5;
float var2 = 10.5f;
Class1 c = new Class1();
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 p1 v 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 var1 v var2. Khi hai bin ny
c truyn cho phng thc SomeMethod th chng c nh x thnh hai tham s p1 v
p2 theo 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:
ThoiGian t = new ThoiGian();
XyDngLp-iTng
93
NgnNgLpTrnhC#
t tht s khng cha gi tr ca i tng ThoiGian, n ch cha a ch ca i tng c
to ra trn heap, do vy t ch 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 ThoiGian tng t nh
vic gi thc hin mt phng thc:
ThoiGian t = new ThoiGian();
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 ThoiGian trong 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 Gi tr mc nh
int, long, byte, 0
bool false
char \0 (null)
enum 0
reference 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
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 DateTime do C# cung cp.
XyDngLp-iTng
94
NgnNgLpTrnhC#
V d 4.3: nh ngha mt b khi dng.
-----------------------------------------------------------------------------
using System;
public class ThoiGian
{
public void ThoiGianHienHanh()
{
Console.WriteLine( Thoi gian hien hanh la : {0}/{1}/{2}
{3}:{4}:{5}, Ngay, Thang, Nam, Gio, Phut, Giay);
}
// Hm khi dng
public ThoiGian( System.DateTime dt )
{
Nam = dt.Year;
Thang = dt.Month;
Ngay = dt.Day;
Gio = dt.Hour;
Phut = dt.Minute;
Giay = dt.Second;
}
// Bin thnh vin private
int Nam;
int Thang;
int Ngay;
int Gio;
int Phut;
int Giay;
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
ThoiGian t = new ThoiGian( currentTime );
t.ThoiGianHienHanh();
}
}
-----------------------------------------------------------------------------
XyDngLp-iTng
95
NgnNgLpTrnhC#
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 DateTime v 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
ThoiGianHienHanh c 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 DateTime
ny c cung cp bi th vin System, lp ny cng cung cp cc bin thnh vin public
nh: 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.DataTime currentTime = 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 currentTime c to th cu lnh tip theo s thc hin vic truyn i
tng currentTime cho phng thc khi dng to mt i tng ThoiGian:
ThoiGian t = new ThoiGian( currentTime );
Bn trong phng thc khi dng ny tham s dt s tham chiu n i tng DateTime l
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
DateTime c to trong hm Main().
C mt s nhn mnh y l i tng DateTime c truyn cho b dng ThoiGian chnh
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 ch hon ton
khng c mt i tng no c sao chp li.
XyDngLp-iTng
96
NgnNgLpTrnhC#
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:
private int Giay = 30; // Khi to
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.
-----------------------------------------------------------------------------
public class ThoiGian
{
public void ThoiGianHienHanh()
{
System.DateTime now = System.DateTime.Now;
System.Console.WriteLine(\n Hien tai: \t {0}/{1}/{2} {3}:{4}:{5},
now.Day, now.Month, now.Year, now.Hour, now.Minute, now.Second);
System.Console.WriteLine( Thoi Gian:\t {0}/{1}/{2} {3}:{4}:{5},
Ngay, Thang, Nam, Gio, Phut, Giay);
}
public ThoiGian( System.DateTime dt)
{
Nam = dt.Year;
Thang = dt.Month;
Ngay = dt.Day;
Gio = dt.Hour;
Phut = dt.Minute;
Giay = dt.Second; // c gn cho bin thnh vin Giay
}
public ThoiGian(int Year, int Month, int Date, int Hour, int Minute)
{
Nam = Year;
Thang = Month;
Ngay = Date;
XyDngLp-iTng
97
NgnNgLpTrnhC#
Gio = Hour;
Phut = Minute;
}
private int Nam;
private int Thang;
private int Ngay;
private int Gio;
private int Phut;
private int Giay = 30 ; // bin c khi to.
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
ThoiGian t1 = new ThoiGian( currentTime );
t1.ThoiGianHienHanh();
ThoiGian t2 = new ThoiGian(2001,7,3,10,5);
t2.ThoiGianHienHanh();
}
}
-----------------------------------------------------------------------------
Kt qu:
Hien tai: 5/6/2002 10:15:5
Thoi Gian: 5/6/2002 10:15:5
Hien tai: 5/6/2002 10:15:5
Thoi Gian: 3/7/2001 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 Giay c khi to gi tr 30:
Giay = 30; // Khi to
Trong trng hp b khi to th hai khng truyn gi tr cho bin Giay nn bin ny vn ly
gi tr m ta khi to ban u l 30:
ThoiGian t2 = new ThoiGian(2001, 7, 3, 10, 5);
t2.ThoiGianHienHanh();
XyDngLp-iTng
98
NgnNgLpTrnhC#
Ngc li, nu mt gi tr c gn cho bin Giay nh 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 ThoiGian th hai, hm khi dng th hai c thc hin, hm ny khng gn
gi tr cho bin Giay nn 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 ThoiGian mi c cng
gi tr vi i tng ThoiGian c. 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:
public ThoiGian( ThoiGian tg)
{
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:
ThoiGian t2 = new ThoiGian( t1 );
Trong t1 l i tng ThoiGian tn ti, sau khi lnh trn thc hin xong th i tng
t2 c 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 this ny.
Tham chiu this ny c s dng thng xuyn theo ba cch:
Q S dng khi cc bin thnh vin b che lp bi tham s a vo, nh trng hp sau:
public void SetYear( int Nam)
{
this.Nam = Nam;
XyDngLp-iTng
99
NgnNgLpTrnhC#
}
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 Nam ch n tham s.
Q S dng tham chiu this truyn i tng hin hnh vo mt tham s ca mt phng
thc ca i tng khc:
public void Method1( OtherClass otherObject )
{
// S dng tham chiu this truyn tham s l bn
// thn i tng ang thc hin.
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.
Q 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 Button v c
hai th hin ca lp tn l btnUpdate v btnDelete. V gi s lp Button ny 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, 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.
XyDngLp-iTng
100
NgnNgLpTrnhC#
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 this hay 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:
using System;
public class Class1
{
public void SomeMethod(int p1, float p2)
{
Console.WriteLine(Ham nhan duoc hai tham so: {0} va {1}, p1,p2);
}
}
public class Tester
{
static void Main()
{
int var1 = 5;
float var2 = 10.5f;
Class1 c = new Class1();
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.
XyDngLp-iTng
101
NgnNgLpTrnhC#
Sau khi to th c th thng qua i tng c ta c th gi c c phng thc Some-
Method().
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 ThoiGian nh sau:
static ThoiGian()
{
Ten = Thoi gian;
}
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 Name bn trn cng phi c khai bo l tnh:
private static string Ten;
Cui cng ta thm mt dng vo phng thc ThoiGianHienHanh() ca lp ThoiGian:
public void ThoiGianHienHanh()
{
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:
private static string Ten = Thoi Gian;
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.
XyDngLp-iTng
102
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
public class Cat
{
public Cat()
{
instance++;
}
public static void HowManyCats()
{
Console.WriteLine({0} cats, instance);
}
private static int instance =0;
}
public class Tester
{
static void Main()
{
Cat.HowManyCats();
Cat mun = new Cat();
Cat.HowManyCats();
Cat muop = new Cat();
XyDngLp-iTng
103
NgnNgLpTrnhC#
Cat miu = new Cat();
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 Finalize ny 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 Finalize thc hin
XyDngLp-iTng
104
NgnNgLpTrnhC#
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
Finalize ca 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 Finalize c kt vi lp c s, do vy khi vit
~Class1()
{
// Thc hin mt s cng vic
}
Cng tng t nh vit :
Class1.Finalize()
{
// Thc hin mt s cng vic
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 IDisposable s c
trnh by chi tit trong Chng 8. Giao din IDisposable yu 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 Dispose l cho php chng trnh thc hin cc cng vic
XyDngLp-iTng
105
NgnNgLpTrnhC#
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:
public void Dispose()
{
// Thc hin cng vic dn dp
// Yu cu b thu dc GC trong thc hin kt thc
GC.SuppressFinalize( this );
}
public override void Finalize()
{
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 Close c v t nhin hn phng thc Dispose trong cc i tng
c lin quan n x l tp tin. Ta c th xy dng phng thc Dispose() vi thuc tnh l
private v phng thc Close() vi thuc tnh public. Trong phng thc Close() n gin
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 GC thc 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.
-----------------------------------------------------------------------------
using System.Drawing;
class Tester
{
XyDngLp-iTng
106
NgnNgLpTrnhC#
public static void Main()
{
using ( Font Afont = new Font(Arial,10.0f))
{
// on m s dng AFont
.......
}// Trnh bin dch s gi Dispose gii phng AFont
Font TFont = new Font(Tahoma,12.0f);
using (TFont)
{
// on m s dng TFont
.......
}// Trnh bin dch gi Dispose gii phng TFont
}
}
-----------------------------------------------------------------------------
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 using thc hin xong th phng thc Dispose() ca font c 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
XyDngLp-iTng
107
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
public class Time
{
public void DisplayCurrentTime()
{
Console.WriteLine({0}/{1}/{2}/ {3}:{4}:{5}, Date,
Month, Year, Hour, Minute, Second);
}
public int GetHour()
{
return Hour;
}
public void GetTime(int h, int m, int s)
{
h = Hour;
m = Minute;
s = Second;
}
public Time( System.DateTime dt)
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
private int Year;
private int Month;
private int Date;
private int Hour;
private int Minute;
private int Second;
XyDngLp-iTng
108
NgnNgLpTrnhC#
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time( currentTime);
t.DisplayCurrentTime();
int theHour = 0;
int theMinute = 0;
int theSecond = 0;
t.GetTime( theHour, theMinute, theSecond);
System.Console.WriteLine(Current time: {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 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, Second th 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 ref vo trc cc tham s trong phng thc GetTime():
public void GetTime( ref int h, ref int m, ref int s)
{
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( ref theHour, ref theMinute, ref theSecond);
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 int sang kiu ref int.
XyDngLp-iTng
109
NgnNgLpTrnhC#
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:
int theHour;
int theMinute;
int theSecond;
t.GetTime( ref int theHour, ref int theMinute, ref int theSecond);
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:
Use of unassigned local variable theHour
Use of unassigned local variable theMinute
Use of unassigned local variable theSecond
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:
public void GetTime( out int h, out int m, out int s)
{
h = Hour;
XyDngLp-iTng
110
NgnNgLpTrnhC#
m = Minute;
s = Second;
}
v cch gi mi phng thc GetTime() trong Main():
t.GetTime( out theHour, out theMinute, out theSecond);
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 out c 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.
-----------------------------------------------------------------------------
using System;
public class Time
{
public void DisplayCurrentTime()
{
Console.WriteLine({0}/{1}/{2} {3}:{4}:{5},
Date, Month, Year, Hour, Minute, Second);
}
public int GetHour()
{
return Hour;
}
public void SetTime(int hr, out int min, ref int sec)
{
// Nu s giy truyn vo >30 th tng s Minute v Second = 0
if ( sec >=30 )
{
Minute++;
Second = 0;
}
Hour = hr; // thit lp gi tr hr c truyn vo
// Tr v gi tr mi cho min v sec
min = Minute;
sec = Second;
}
public Time( System.DateTime dt)
XyDngLp-iTng
111
NgnNgLpTrnhC#
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
// bin thnh vin private
private int Year;
private int Month;
private int Date;
private int Hour;
private int Minute;
private int Second;
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime();
int theHour = 3;
int theMinute;
int theSecond = 20;
t.SetTime( theHour, out theMinute, ref theSecond);
Console.WriteLine(The Minute is now: {0} and {1} seconds ,
theMinute, theSecond);
theSecond = 45;
t.SetTime( theHour, out theMinute, ref theSecond);
Console.WriteLine(The Minute is now: {0} and {1} seconds,
theMinute, theSecond);
}
}
-----------------------------------------------------------------------------
Kt qu:
8/6/2002 15:35:24
XyDngLp-iTng
112
NgnNgLpTrnhC#
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 Hour v tham s ny khng c s dng v bt c gi
tr no.
Tham s th hai l theMinute c 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 theSecond c 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 theSecond c gn gi tr ca bin thnh vin Second v c tr v.
Do hai bin theHour v theSecond c s dng trong phng thc SetTime nn phi c
khi to trc khi truyn vo phng thc. Cn vi bin theMinute th 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:
void myMethod( int p1 );
void myMethod( int p1, int p2 );
void myMethod( int p1, string p2 );
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.
XyDngLp-iTng
113
NgnNgLpTrnhC#
V d 4.9 minh ha lp Time c hai phng thc khi dng, mt phng thc nhn tham s
l mt i tng DateTime cn phng thc th hai th nhn su tham s nguyn.
V d 4.9: Minh ha np chng phng thc khi dng.
-----------------------------------------------------------------------------
using System;
public class Time
{
public void DisplayCurrentTime()
{
Console.WriteLine({0}/{1}/{2} {3}:{4}:{5},
Date, Month, Year, Hour, Minute, Second);
}
public Time( System.DateTime dt)
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
public Time(int Year, int Month, int Date, int Hour, int Minute, int Second)
{
this.Year = Year;
this.Month = Month;
this.Date = Date;
this.Hour = Hour;
this.Minute = Minute;
this.Second = Second;
}
// Bin thnh vin private
private int Year;
private int Month;
private int Date;
private int Hour;
private int Minute;
private int Second;
}
XyDngLp-iTng
114
NgnNgLpTrnhC#
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
Time t1 = new Time( currentTime);
t1.DisplayCurrentTime();
Time t2 = new Time(2002,6,8,18,15,20);
t2.DisplayCurrentTime();
}
}
-----------------------------------------------------------------------------
Kt qu:
2/1/2002 17:50:17
8/6/2002 18:15:20
-----------------------------------------------------------------------------
Nh chng ta thy, lp Time trong 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 t1 v 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.
-----------------------------------------------------------------------------
using System;
public class Tester
{
private int Triple( int val)
{
return 3*val;
}
private long Triple(long val)
{
return 3*val;
XyDngLp-iTng
115
NgnNgLpTrnhC#
}
public void Test()
{
int x = 5;
int y = Triple(x);
Console.WriteLine(x: {0} y: {1}, x, y);
long lx = 10;
long ly = Triple(lx);
Console.WriteLine(lx: {0} ly:{1}, lx, ly);
}
static void Main()
{
Tester t = new Tester();
t.Test();
}
}
-----------------------------------------------------------------------------
Kt qu:
x: 5 y: 15
lx: 10 ly:30
-----------------------------------------------------------------------------
Trong v d ny, lp Tester np 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).
XyDngLp-iTng
116
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
public class Time
{
public void DisplayCurrentTime()
{
Console.WriteLine(Time\t: {0}/{1}/{2} {3}:{4}:{5},
date, month, year, hour, minute, second);
}
public Time( System.DateTime dt)
{
year = dt.Year;
month = dt.Month;
date = dt.Day;
hour = dt.Hour;
minute = dt.Minute;
second = dt.Second;
}
public int Hour
{
get
{
return hour;
}
set
{
hour = value;
}
}
// Bin thnh vin private
private int year;
private int month;
private int date;
XyDngLp-iTng
117
NgnNgLpTrnhC#
private int hour;
private int minute;
private int second;
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time( currentTime );
t.DisplayCurrentTime();
// Ly d liu t thuc tnh Hour
int theHour = t.Hour;
Console.WriteLine( Retrieved the hour: {0}, theHour);
theHour++;
t.Hour = theHour;
Console.WriteLine(Updated the hour: {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:
public int Hour
{
get
{
return hour;
}
set
{
hour = value;
}
XyDngLp-iTng
118
NgnNgLpTrnhC#
}
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:
private int hour;
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 hour ni m gi tr ca thuc tnh Hour lu tr:
get
{
return hour;
}
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 get s c thc hin c gi tr ca thuc tnh:
Time t = new Time( currentTime );
int theHour = 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.
XyDngLp-iTng
119
NgnNgLpTrnhC#
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 Time cung 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.
-----------------------------------------------------------------------------
using System;
public class RightNow
{
// nh ngha b khi to static cho cc bin static
static RightNow()
{
System.DateTime dt = System.DateTime.Now;
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
// Bin thnh vin static
public static int Year;
public static int Month;
public static int Date;
public static int Hour;
public static int Minute;
public static int Second;
}
public class Tester
{
static void Main()
XyDngLp-iTng
120
NgnNgLpTrnhC#
{
Console.WriteLine(This year: {0},
RightNow.Year.ToString());
RightNow.Year = 2003;
Console.WriteLine(This year: {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 static
c 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:
public static readonly int Year;
public static readonly int Month;
public static readonly int Date;
public static readonly int Hour;
public static readonly int Minute;
public static readonly int Second;
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
Cu hi 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?
XyDngLp-iTng
121
NgnNgLpTrnhC#
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.
Cu hi 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.
Cu hi 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.
Cu hi 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?
Cu hi 2: T kho no c s dng trong vic thc thi thuc tnh ca lp?
Cu hi 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?
Cu hi 5: Lm sao truyn tham chiu vi bin kiu gi tr vo trong mt phng thc?
XyDngLp-iTng
122
NgnNgLpTrnhC#
Cu hi 6: Khi no th phng thc khi dng c gi?
Cu hi 7: Phng thc khi dng tnh c gi khi no?
Cu hi 8: C th truyn bin cha khi to vo mt hm c khng?
Cu hi 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?
Cu hi 11: Lp m chng ta xy dng thuc kiu d liu no?
Cu hi 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 tp 2: 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?
-----------------------------------------------------------------------------
using System;
using System.Console;
class VD1
{
public string first;
}
class Tester
{
public static void Main()
{
VD1 vd = new VD1();
Write(Nhap vao mot chuoi: );
vd.first = ReadLine();
Write(Chuoi nhap vao: {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?
-----------------------------------------------------------------------------
XyDngLp-iTng
123
NgnNgLpTrnhC#
class Class1
{
public static void GetNumber(ref int x, ref int y)
{
x = 5;
y = 10;
}
public static void Main()
{
int a = 0, b = 0;
GetNumber(a, b);
System.Console.WriteLine(a = {0} \nb = {1}, a, b);
}
}
-----------------------------------------------------------------------------
Cu hi 6: Chng trnh sau y c li. Hy sa li v cho bit lnh no pht sinh li?
-----------------------------------------------------------------------------
Class Tester
{
public static void Main()
{
Display();
}
public static void Display()
{
System.Console.WriteLine(Hello!);
return 0;
}
}
-----------------------------------------------------------------------------
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.
XyDngLp-iTng
124
NgnNgLpTrnhC#
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).
KThaaHnh
125
NgnNgLpTrnhC#
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 Object l 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:
KThaaHnh
126
NG
VT
C V
MO CH
NgnNgLpTrnhC#
Tng t, khi chng ta ni rng ListBox v Button l nhng Window, ta phi ch ra nhng
c tnh v hnh vi ca nhng Window c 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 ListBox v Button s 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.
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.
KThaaHnh
127
Window
Button List Box
Window
NgnNgLpTrnhC#
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 Window nhng 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.
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
ListBox iu dn xut t lp Window, trong Button c 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
Button l Window.
KThaaHnh
128
Window
Command
List Box
Check Box
Button
Radio
Button
Radio
Button
List Box Check Box Command
NgnNgLpTrnhC#
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:
public class ListBox : 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.
-----------------------------------------------------------------------------
using System;
public class Window
{
// Hm khi dng ly hai s nguyn ch
// n v tr ca ca s trn console
public Window( int top, int left)
{
this.top = top;
this.left = left;
}
// m phng v ca s
public void DrawWindow()
{
Console.WriteLine(Drawing Window at {0}, {1}, top, left);
KThaaHnh
129
NgnNgLpTrnhC#
}
// C hai bin thnh vin private do
// hai bin ny s khng thy bn trong lp
// dn xut.
private int top;
private int left;
}
// ListBox dn xut t Window
public class ListBox: Window
{
// Khi dng c tham s
public ListBox(int top, int left,
string theContents) : base(top, left) // gi khi dng ca lp c s
{
mListBoxContents = theContents;
}
// To mt phin bn mi cho phng thc DrawWindow
// v trong lp dn xut mun thay i hnh vi thc hin
// bn trong phng thc ny
public new void DrawWindow()
{
base.DrawWindow();
Console.WriteLine( ListBox write: {0}, mListBoxContents);
}
// bin thnh vin private
private string mListBoxContents;
}
public class Tester
{
public static void Main()
{
// to i tng cho lp c s
Window w = new Window(5, 10);
w.DrawWindow();
// to i tng cho lp dn xut
ListBox lb = new ListBox( 20, 10, Hello world!);
lb.DrawWindow();
}
KThaaHnh
130
NgnNgLpTrnhC#
}
-----------------------------------------------------------------------------
Kt qu:
Drawing Window at: 5, 10
Drawing Window at: 20, 10
ListBox write: 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 ListBox(
int theTop,
int theLeft,
string theContents):
base( theTop, theLeft) // gi khi to lp c s
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():
public new void DrawWindow()
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.
KThaaHnh
131
NgnNgLpTrnhC#
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 ListBox s lm n v thay th
phng thc DrawWindow ca lp c s Window. Khi chng ta gi phng thc
DrawWindow ca mt i tng ca lp ListBox th phng thc ListBox.DrawWindow() s
c thc hin, khng phi phng thc Window.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(); // gi phng thc c s
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 protected
internal.
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 . Internal m 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 internal hay 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
MyClass nh sau:
public class MyClass
{
//...
protected int myValue;
KThaaHnh
132
NgnNgLpTrnhC#
}
Nh trn bin thnh vin myValue c khai bo truy xut protected mc 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 Window ny 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() ca lp
Window trong v d 5.1 l a hnh, n gin l ta thm t kha virtual vo khai bo nh sau:
public virtual void DrawWindow()
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
KThaaHnh
133
NgnNgLpTrnhC#
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 ListBox dn xt t lp Window v thc thi mt phin bn
ring ca phng thc DrawWindow():
public override void DrawWindow()
{
base.DrawWindow();
Console.WriteLine(Writing string to the listbox: {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:
Window win = new Window( 1, 2 );
ListBox lb = new ListBox( 3, 4, Stand alone list box);
Button b = new Button( 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 Button
cng l mt Window.
Window[] winArray = new Window[3];
winArray[0] = new Window( 1, 2 );
winArray[1] = new ListBox( 3, 4, List box is array);
winArray[2] = new Button( 5, 6 );
Chuyn g xy ra khi chng ta gi phng thc DrawWindow() cho tng i tng trong
mng winArray.
for( int i = 0; i < 3 ; i++)
{
winArray[i].DrawWindow();
KThaaHnh
134
NgnNgLpTrnhC#
}
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 thc DrawWindow() trong lp Window l virtual th phng thc DrawWindow()
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.
-----------------------------------------------------------------------------
using System;
public class Window
{
public Window( int top, int left )
{
this.top = top;
this.left = left;
}
// phng thc c khai bo o
public virtual void DrawWindow()
{
Console.WriteLine( Window: drawing window at {0}, {1}, top, left );
}
// bin thnh vin ca lp
protected int top;
protected int left;
}
public class ListBox : Window
{
// phng thc khi dng c tham s
public ListBox( int top, int left, string contents ): base( top, left)
{
listBoxContents = contents;
}
// thc hin vic ph quyt phng thc DrawWindow
KThaaHnh
135
NgnNgLpTrnhC#
public override void DrawWindow()
{
base.DrawWindow();
Console.WriteLine( Writing string to the listbox: {0}, listBoxContents);
}
// bin thnh vin ca ListBox
private string listBoxContents;
}
public class Button : Window
{
public Button( int top, int left) : base( top, left )
{
}
// ph quyt phng thc DrawWindow ca lp c s
public override void DrawWindow()
{
Console.WriteLine( Drawing a button at {0}: {1}, top, left);
}
}
public class Tester
{
static void Main()
{
Window win = new Window(1,2);
ListBox lb = new ListBox( 3, 4, Stand alone list box);
Button b = new Button( 5, 6 );
win.DrawWindow();
lb.DrawWindow();
b.DrawWindow();
Window[] winArray = new Window[3];
winArray[0] = new Window( 1, 2 );
winArray[1] = new ListBox( 3, 4, List box is array);
winArray[2] = new Button( 5, 6 );
for( int i = 0; i < 3; i++)
{
winArray[i].DrawWindow();
}
}
KThaaHnh
136
NgnNgLpTrnhC#
}
-----------------------------------------------------------------------------
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:
public override void DrawWindow()
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 Window tham chiu n mt i tng tht s l ListBox.
Ghi ch: Chng ta phi ch nh r rng vi t kha override khi 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 Window do cng ty A pht trin.
Khi nhm lp trnh ca cng ty B quyt nh thm mt phng thc Sort( ) vo lp ListBox:
public class ListBox : Window
{
public virtual void Sort( ) {.}
KThaaHnh
137
NgnNgLpTrnhC#
}
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:
public class Window
{
//..
public virtual void Sort( ) {.}
}
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 ListBox th 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 Listbox
khng 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): warning CS0114: ListBox.Sort( ) hides
inherited member Window.Sort().
To make the current member override that implementation,
add the override keyword. Otherwise add the new keyword.
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:
public class ListBox : Window
{
public new virtual Sort( ) {.}
}
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:
public class ListBox : Window
{
public override void Sort( ) {}
KThaaHnh
138
NgnNgLpTrnhC#
}
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:
abstract public void DrawWindow( );
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 Window ta c th khai bo l lp tru tng nh sau:
abstract public void Window
V d 5.3 sau minh ha vic to lp Window tru tng v phng thc tru tng
DrawWindow() ca lp Window.
V d 5.3: S dng phng thc v lp tru tng.
-----------------------------------------------------------------------------
using System;
abstract public class Window
{
// hm khi dng ly hai tham s
public Window( int top, int left)
{
KThaaHnh
139
NgnNgLpTrnhC#
this.top = top;
this.left = left;
}
// phng thc tru tng minh ha vic
// v ra ca s
abstract public void DrawWindow();
// bin thnh vin protected
protected int top;
protected int left;
}
// lp ListBox dn xut t lp Window
public class ListBox : Window
{
// hm khi dng ly ba tham s
public ListBox( int top, int left, string contents) : base( top, left)
{
listBoxContents = contents;
}
// ph quyt phng thc tru tng DrawWindow()
public override void DrawWindow( )
{
Console.WriteLine(Writing string to the listbox: {0}, listBoxContents);
}
// bin private ca lp
private string listBoxContents;
}
// lp Button dn xut t lp Window
public class Button : Window
{
// hm khi to nhn hai tham s
public Button( int top, int left) : base( top, left)
{
}
// thc thi phng thc tru tng
public override void DrawWindow()
{
Console.WriteLine(Drawing button at {0}, {1}\n, top, left);
}
KThaaHnh
140
NgnNgLpTrnhC#
}
public class Tester
{
static void Main()
{
Window[] winArray = new Window[3];
winArray[0] = new ListBox( 1, 2, First List Box);
winArray[1] = new ListBox( 3, 4, Second List Box);
winArray[2] = new Button( 5, 6);
for( int i=0; i <3 ; i++)
{
winArray[i].DrawWindow( );
}
}
}
-----------------------------------------------------------------------------
Trong v d 5.3, lp Window c 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] = new ListBox( 1, 2, First List Box);
bng cu lnh sau:
winArray[0] = new Window( 1, 2);
Th trnh bin dch s bo mt li nh sau:
Cannot create an instance of the abstract class or interface Window
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 ListBox nh 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
KThaaHnh
141
NgnNgLpTrnhC#
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 Window th 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 sealed nhm 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:
ListBox cannot inherit from sealed class Window
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 Object cung 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
KThaaHnh
142
NgnNgLpTrnhC#
() tr v mt chui th hin lp hin hnh. Sau y l bng tm tt cc phng thc ca lp
Object.
Phng thc Chc nng
Equal( ) So snh bng nhau gia hai i tng
GetHashCode( ) Cho php nhng i tng cung cp ring
nhng hm bm cho s dng tp hp.
GetType( ) Cung cp kiu ca i tng
ToString( ) Cung cp chui th hin ca i tng
Finalize( ) Dn dp cc ti nguyn
MemberwiseClone( ) 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.
-----------------------------------------------------------------------------
using System;
public class SomeClass
{
public SomeClass( int val )
{
value = val;
}
// ph quyt phng thc ToString ca lp Object
public virtual string ToString()
{
return value.ToString();
}
// bin thnh vin private lu gi tr
private int value;
}
public class Tester
{
static void Main( )
{
int i = 5;
Console.WriteLine(The value of i is: {0}, i.ToString());
SomeClass s = new SomeClass(7);
Console.WriteLine(The value of s is {0}, s.ToString());
KThaaHnh
143
NgnNgLpTrnhC#
Console.WriteLine(The value of 5 is {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 Object phng thc ToString() c khai bo nh sau:
public virtual string ToString();
y l phng thc o public, phng thc ny tr v mt chui v khng nhn tham s. Tt
c kiu d liu c xy dng sn, nh kiu int, dn xut t lp Object nn 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:
The value of s is SomeClass
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 ca
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 int
trong 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.
KThaaHnh
144
NgnNgLpTrnhC#
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:
using System;
class Boxing
{
public static void Main()
{
int i = 123;
Console.WriteLine(The object value = {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:
KThaaHnh
145
Heap Stack
123
i
int i = 123;
o
object o=i;
i boxed
123 Int
123
NgnNgLpTrnhC#
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.
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.
-----------------------------------------------------------------------------
using System;
public class UnboxingTest
{
public static void Main()
{
int i = 123;
// Boxing
object o = i;
// Unboxing phi c tng minh
int k = (int) o;
Console.WriteLine(k: {0}, k);
KThaaHnh
146
Heap Stack
123
int i = 123;
o
object o=i;
123
Int
123
k
int k = (int)o;
123
i boxed
i
NgnNgLpTrnhC#
}
}
-----------------------------------------------------------------------------
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 int
mi, 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 InvalidCastException s 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, Point c 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) trong Java.
V d 5.6 sau s thm mt lp lng vo lp Fraction tn l FractionArtist. Chc nng ca lp
FractionArtis l v mt phn s ra mn hnh. Trong v d ny, vic v s c thay th bng
s dng hm WriteLine xut ra mn hnh console.
V d 5.6: S dng lp lng nhau.
-----------------------------------------------------------------------------
using System;
using System.Text;
KThaaHnh
147
NgnNgLpTrnhC#
public class Fraction
{
public Fraction( int numerator, int denominator)
{
this.numerator = numerator;
this.denominator = denominator;
}
public override string ToString()
{
StringBuilder s = new StringBuilder();
s.AppendFormat({0}/{1},numerator, denominator);
return s.ToString();
}
internal class FractionArtist
{
public void Draw( Fraction f)
{
Console.WriteLine(Drawing the numerator {0}, f.numerator);
Console.WriteLine(Drawing the denominator {0}, f.denominator);
}
}
// bin thnh vin private
private int numerator;
private int denominator;
}
public class Tester
{
static void Main()
{
Fraction f1 = new Fraction( 3, 4);
Console.WriteLine(f1: {0}, f1.ToString());
Fraction.FractionArtist fa = new Fraction.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
KThaaHnh
148
NgnNgLpTrnhC#
FractionArtist ch 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 private l f.numerator v
f.denominator. Hai vin thnh vin private ny s khng cho php truy cp nu
FractionArtist khng 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 fa = new Fraction.FractionArtist();
Thm ch khi lp FractionArtist l public, th phm v ca lp ny vn nm bn trong ca lp
Fraction.
Cu hi v tr li
Cu hi 1: C cn thit phi ch nh t kha override trong 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.
Cu hi 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.
Cu hi 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.
Cu hi 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
Cu hi 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
Cu hi 1: S t bit ha c s dng trong C# thng qua tnh g?
Cu hi 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?
KThaaHnh
149
NgnNgLpTrnhC#
Cu hi 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.
Cu hi 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 tp 2: 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?
-----------------------------------------------------------------------------
using System;
abstract public class Animal
{
public Animal(string name)
{
this.name = name;
}
KThaaHnh
150
NgnNgLpTrnhC#
// phng thc tru tng minh ha vic
// a tn ca i tng
abstract public void Who();
// bin thnh vin protected
protected string name;
}
// lp Dog dn xut t lp Animal
public class Dog : Animal
{
// hm khi dng ly hai tham s
public Dog(string name, string color) : base(name)
{
this.color = color;
}
// ph quyt phng thc tru tng Who()
public override void Who( )
{
Console.WriteLine(Gu gu! Toi la {0} co mau long {1}, name, color);
}
// bin private ca lp
private string color;
}
public class Cat : Animal
{
// hm khi dng ly hai tham s
public Cat(string name, int weight) : base(name)
{
this.weight = weight;
}
// ph quyt phng thc tru tng Who()
public override void Who( )
{
Console.WriteLine(Meo meo! Toi la {0} can nang {1}, name, weight);
}
// bin private ca lp
private int weight;
}
public class Tester
KThaaHnh
151
NgnNgLpTrnhC#
{
static void Main()
{
Animal[] Arr = new Animal[3];
Arr[0] = new Dog(Lu Lu, Vang);
Arr[1] = new Cat(Mun, 5);
Arr[2] = new Animal(Noname);
for( int i=0; i <3 ; i++)
{
Arr[i].Who();
}
}
}
-----------------------------------------------------------------------------
KThaaHnh
152
NgnNgLpTrnhC#
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:
Fraction theSum = 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:
Fraction theSum = 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
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
NpChngTonT
153
NgnNgLpTrnhC#
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:
public static Fraction operator + ( Fraction lhs, Fraction rhs)
Trong ton t trn ta c s qui c t tn ca tham s l lhs v rhs. Tham s tn lhs thay
th cho left hand side tc l ton hng bn tri, tng t tham s tn rhs thay 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:
Fraction theSum = 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 Fraction cho 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
NpChngTonT
154
NgnNgLpTrnhC#
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 Speci-
fication (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 Time th 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 Tn ton t
+ Add Ton t cng
- Subtract Ton t tr
* Multiply Ton t nhn
NpChngTonT
155
NgnNgLpTrnhC#
/ Divide Ton t chia
% Mod Ton t chia ly d
^ Xor Ton t or loi tr
& BitwiseAnd Ton t and nh phn
| BitwiseOr Ton t or nh phn
&& And Ton t and logic
|| Or Ton t or logic
= Assign Ton t gn
<< LeftShift Ton t dch tri
>> RightShift Ton t dch phi
== Equals Ton t so snh bng
> Compare Ton t so snh ln hn
< Compare Ton t so snh nh hn
!= Compare Ton t so snh khng bng
>= Compare Ton t so snh ln hn hay
bng
<= Compare Ton t so snh nh hn hay
bng
*= Multiply Ton t nhn ri gn tr li
-= Subtract Ton t tr ri gn tr li
^= Xor Ton t or loi tr ri gn li
<<= LeftShift Ton t dch tri ri gn li
%= Mod Ton t chia d ri gn li
+= Add Ton t cng ri gn li
&= BitwiseAnd Ton t and ri gn li
|= BitwiseOr Ton t or ri gn li
/= Divide Ton t chia ri gn
-- Decrement Ton t gim
++ Increment Ton t tng
- Negate Ton t ph nh mt ngi
+ Plus Ton t cng mt ngi
~ OnesComplement 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
NpChngTonT
156
NgnNgLpTrnhC#
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 object thc thi phng thc Equals() vi khai bo sau:
public override bool Equals( object 0 )
Bng cch ph quyt phng thc ny, chng ta cho php lp Fraction hnh 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 Fraction khc, v nu nh chng ta thc
thi mt ton t so snh bng th c th nh ngha phng thc Equals() nh sau:
pubic override bool Equals( object o)
{
if ( !(o is Fraction) )
{
return false;
}
return this == (Fraction) o;
}
Ton t is c 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 Fraction nn ton t is s 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 long sang kiu int mt 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 long
sang 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 int lu trong b nh:
int myInt = 5;
long myLong;
myLong = myInt; // ngm nh
myInt = (int) myLong; // tng minh
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.
NpChngTonT
157
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
public class Fraction
{
public Fraction(int numerator,int denominator)
{
Console.WriteLine("In Fraction Constructor( int, int) ");
this.numerator = numerator;
this.denominator = denominator;
}
public Fraction(int wholeNumber)
{
Console.WriLine("In Fraction Constructor( int )");
numerator = wholeNumber;
denominator = 1;
}
public static implicit operator Fraction( int theInt )
{
Console.WriteLine(" In implicit conversion to Fraction");
return new Fraction( theInt );
}
public static explicit operator int( Fraction theFraction )
{
Console.WriteLine("In explicit conversion to int");
return theFraction.numerator / theFraction.denominator;
}
public static bool operator == ( Fraction lhs, Fraction rhs)
{
NpChngTonT
158
NgnNgLpTrnhC#
Console.WriteLine("In operator ==");
if ( lhs.numerator == rhs.numerator &&
lhs.denominator == rhs.denominator )
{
return true;
}
// thc hin khi hai phn s khng bng nhau
return false;
}
public static bool operator != ( Fraction lhs, Fraction rhs)
{
Console.WriteLine("In operator !=");
return !( lhs == rhs );
}
public override bool Equals( object o )
{
Console.WriteLine("In method Equals");
if ( !(o is Fraction ))
{
return false;
}
return this == ( Fraction ) o;
}
public static Fraction operator+( Fraction lhs, Fraction rhs )
{
Console.WriteLine("In operator +");
if (lhs.denominator == rhs.denominator )
{
return new Fraction( lhs.numerator + rhs.numerator, lhs.denominator );
}
//thc hin khi hai mu s khng bng nhau
int firstProduct = lhs.numerator * rhs.denominator;
int secondProduct = rhs.numerator * lhs.denominator;
return new Fraction( firstProduct + secondProduct,
lhs.denominator * rhs.denominator);
}
public override string ToString()
{
NpChngTonT
159
NgnNgLpTrnhC#
string s = numerator.ToString() + "/" + denominator.ToString();
return s;
}
//bin thnh vin lu t s v mu s
private int numerator;
private int denominator;
}
public class Tester
{
static void Main()
{
Fraction f1 = new Fraction( 3, 4);
Console.WriteLine("f1:{0}",f1.ToString());
Fraction f2 = new Fraction( 2, 4);
Console.WriteLine("f2:{0}",f2.ToString());
Fraction f3 = f1 + f2;
Console.WriteLine("f1 + f2 = f3:{0}",f3.ToString());
Fraction f4 = f3 + 5;
Console.WriteLine("f4 = f3 + 5:{0}",f4.ToString());
Fraction f5 = new Fraction( 2, 4);
if( f5 == f2 )
{
Console.WriteLine("f5:{0}==f2:{1}",
f5.ToString(), f2.ToString());
}
}
}
-----------------------------------------------------------------------------
Lp Fraction bt 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:
public static implicit operator Fraction( int theInt )
{
return new Fraction( theInt);
NpChngTonT
160
NgnNgLpTrnhC#
}
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 Fraction ra
mt s nguyn:
public static explicit operator int( Fraction theFraction )
{
return theFraction.numerator / theFraction.denominator;
}
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/8 s 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:
public static Fraction operator + ( Fraction lhs, Fraction rhs)
{
if ( lhs.denominator == rhs.denominator)
{
return new Fraction( lhs.numerator + rhs.numerator, lhs.denominator);
}
}
Nu mu s khng cng nhau, th chng ta thc hin nhn cho:
int firstProduct = lhs.numerator * rhs.denominator;
int secondProduct = rhs.numerator * lhs.denominator;
return new Fraction( firstProduct + secondProduct, lhs.denominator *
NpChngTonT
161
NgnNgLpTrnhC#
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:
public override string ToString()
{
string s = numerator.ToString() + / + denominator.ToString();
return s;
}
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:
Fraction f1 = new Fraction( 3, 4);
Console.WriteLine("f1:{0}",f1.ToString());
Fraction f2 = new Fraction( 2, 4);
Console.WriteLine("f2:{0}",f2.ToString());
Kt qu thc hin cc lnh trn nh sau:
In Fraction Constructor(int, int)
f1: 3/4
In Fraction Constructor(int, int)
f2: 2/4
Do trong phng phc khi dng ca lp Fraction chng 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:
Fraction f3 = f1 + f2;
Console.WriteLine(f1 + f2 = f3: {0}, f3.ToString());
Hai cu lnh trn s cho ra kt qu nh sau:
In operator +
In Fraction Constructor( 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.
NpChngTonT
162
NgnNgLpTrnhC#
Hai cu lnh tip theo cng mt gi tr nguyn vo phn s f3 v gn kt qu mi v cho phn
s mi f4:
Fraction f4 = f3 + 5;
Console.WriteLine(f3 + 5 = f4: {0}, f4.ToString());
Kt qu c trnh by theo th t sau:
In implicit conversion to Fraction
In Fraction Construction(int)
In operator+
In Fraction Constructor(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,..
Cu hi 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...
Cu hi 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
NpChngTonT
163
NgnNgLpTrnhC#
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?
Cu hi 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 tp 3: Tng t nh bi tp 2 nhng im nm trong khng gian 3 chiu.
Bi tp 4: Xy dng lp s phc (s o) vi cc php ton cng, tr, nhn, chia.
NpChngTonT
164
NgnNgLpTrnhC#
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 stack th 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
C php khai bo mt cu trc cng tng t nh cch khai bo mt lp:
[thuc tnh] [b sung truy cp] struct <tn cu trc> [: danh sch giao din]
{
[thnh vin ca cu trc]
CuTrc
165
NgnNgLpTrnhC#
}
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, x v y. Ta x v y ca Location c khai bo nh l thuc tnh.
V d 7.1 To mt cu trc.
-----------------------------------------------------------------------------
using System;
public struct Location
{
public Location( int xCoordinate, int yCoordinate)
{
xVal = xCoordinate;
yVal = yCoordinate;
}
public int x
{
get
{
return xVal;
}
set
{
xVal = value;
}
}
public int y
{
get
{
return yVal;
}
set
{
yVal = value;
}
}
CuTrc
166
NgnNgLpTrnhC#
public override string ToString()
{
return (String.Format({0}, {1}, xVal, yVal));
}
// thuc tnh private lu to x, y
private int xVal;
private int yVal;
}
public class Tester
{
public void myFunc( Location loc)
{
loc.x = 50;
loc.y = 100;
Console.WriteLine(Loc1 location: {0}, loc);
}
static void Main()
{
Location loc1 = new Location( 200, 300);
Console.WriteLine(Loc1 location: {0}, loc1);
Tester t = new Tester();
t.myFunc( loc1 );
Console.WriteLine(Loc1 location: {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.
CuTrc
167
NgnNgLpTrnhC#
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:
private int xVal = 20;
private int yVal = 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 Tester to mt th
hin ca Location nh sau:
Location loc1 = new Location( 200, 300);
y mt th hin mi tn l loc1 v 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 loc1
c to vi gi tr l 200 v 300. Dng lnh sau s gi thc hin b khi to ca cu trc
Location:
Location loc1 = new Location( 200, 300);
Sau phng tc WriteLine() c gi:
Console.WriteLine(Loc1 location: {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.
Loc1 location 200, 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 );
CuTrc
168
NgnNgLpTrnhC#
Trong phng thc myFunc() hai gi tr mi c gn cho x v y, sau gi tr mi s c
xut ra mn hnh:
Loc1 location: 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:
Loc1 location: 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 class nh
sau:
public class Location
Sau chy li chng trnh th c kt qu:
Loc1 location: 200, 3000
In myFunc loc: 50, 100
Loc1 location: 50, 100
Lc ny Location l mt i tng tham chiu nn khi truyn vo phng thc myFunc() th
vic gn gi tr mi cho x v y iu 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:
/*public Location( int xCoordinate , int yCoordinate)
{
xVal = xCoordinate;
yVal = yCoordinate;
}
*/
v ta thay dng lnh u tin trong hm Main() to Location c hai tham s bng cu lnh to
khng tham s nh sau:
//Location loc1 = new Location( 200, 300)
Location loc1 = new Location();
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:
Loc1 location 0, 0
In myFunc loc: 50, 100
Loc1 location: 0, 0
B khi to mc nh thit lp tt c cc bin thnh vin vi gi tr 0.
CuTrc
169
NgnNgLpTrnhC#
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 Location l 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 new c gi:
Location loc1 = new Location( 200, 300);
kt qu mt i tng Location c 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 new bi 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 new s 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.
-----------------------------------------------------------------------------
using System;
public struct Location
{
public Location( int xCoordinate, int yCoordinate)
{
xVal = xCoordinate;
yVal = yCoordinate;
}
public int x
{
get
{
return xVal;
}
CuTrc
170
NgnNgLpTrnhC#
set
{
xVal = value;
}
}
public int y
{
get
{
return yVal;
}
set
{
yVal = value;
}
}
public override string ToString()
{
return (string.Format({0} ,{1}, xVal, yVal));
}
// bin thnh vin lu ta x, y
public int xVal;
public int yVal;
}
public class Tester
{
static void Main()
{
Location loc1;
loc1.xVal = 100;
loc1.yVal = 250;
Console.WriteLine(loc1);
}
}
-----------------------------------------------------------------------------
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 loc1 v trc khi truyn i tng cho phng thc WriteLine():
loc1.xVal = 100;
CuTrc
171
NgnNgLpTrnhC#
loc2.yVal = 250;
Nu chng ta th b mt lnh gn v bin dch li:
static void Main()
{
Location loc1;
loc1.xVal = 100;
//loc1.yVal = 250;
Console.WriteLine( loc1 );
}
Chng ta s nhn mt li bin dch nh sau:
Use of unassigned local variable loc1
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 x v thuc tnh y:
static void Main()
{
Location loc1;
// gn cho bin thnh vin
loc1.xVal = 100;
loc1.yVal = 250;
// s dng thuc tnh
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 xVal v yVal l 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
Cu hi 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
CuTrc
172
NgnNgLpTrnhC#
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#/.
Cu hi 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.
Cu hi 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.
Cu hi 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.
Cu hi 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?
struct myStruct
{
private int mNum = 100;
....
}
Cu hi 2: S khc nhau gia kiu d liu tham chiu v kiu d liu gi tr?
Cu hi 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?
-----------------------------------------------------------------------------
using System;
struct TheStruct
{
CuTrc
173
NgnNgLpTrnhC#
public int x;
public TheStruct()
{
x = 10;
}
}
class TestClass
{
public static void structtaker( TheStruct s)
{
s.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
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.
-----------------------------------------------------------------------------
using System;
class TheClass
{
public int x;
}
struct TheStruct
{
public int x;
}
class TestClass
{
public static void structtaker( TheStruct s)
{
CuTrc
174
NgnNgLpTrnhC#
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
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.
CuTrc
175
NgnNgLpTrnhC#
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.
ThcThiGiaoDin
176
NgnNgLpTrnhC#
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:
[thuc tnh] [b sung truy cp] interface <tn giao din> [: danh sch c s]
{
<phn thn giao din>
}
Phn thuc tnh chng ta s cp sau. Thnh phn b sung truy cp bao gm:
public, private, protected, internal, v protected internal 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:
interface IStorable
{
void Read();
void Write(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
Document c tha k t IStorable bng dng du hai chm (:) v theo sau l tn giao din:
ThcThiGiaoDin
177
NgnNgLpTrnhC#
public class Document : IStorable
{
public void Read()
{
....
}
public void Write()
{
....
}
}
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 bin dch s bo
mt li. Sau y l on chng trnh minh ha vic xy dng lp Document thc thi giao
din IStorable.
V d 8.1: S dng mt giao din.
-----------------------------------------------------------------------------
using System;
// khai bo giao din
interface IStorable
{
// giao din khng khai bo b sung truy cp
// phng thc l public v khng thc thi
void Read();
void Write(object obj);
int Status
{
get;
set;
}
}
// to mt lp thc thi giao din IStorable
public class Document : IStorable
{
public Document( string s)
{
Console.WriteLine(Creating document with: {0}, s);
ThcThiGiaoDin
178
NgnNgLpTrnhC#
}
// thc thi phng thc Read()
public void Read()
{
Console.WriteLine(Implement the Read Method for IStorable);
}
// thc thi phng thc Write
public void Write( object o)
{
Console.WriteLine(Impleting the Write Method for IStorable);
}
// thc thi thuc tnh
public int Status
{
get
{
return status;
}
set
{
status = value;
}
}
// lu tr gi tr thuc tnh
private int status = 0;
}
public class Tester
{
static void Main()
{
// truy cp phng thc trong i tng Document
Document doc = new Document(Test Document);
doc.Status = -1;
doc.Read();
Console.WriteLine(Document Status: {0}, doc.Status);
// gn cho mt giao din v s dng giao din
IStorable isDoc = (IStorable) doc;
isDoc.Status = 0;
ThcThiGiaoDin
179
NgnNgLpTrnhC#
isDoc.Read();
Console.WriteLine(IStorable Status: {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():
int Status { 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 Status
nhng 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:
public class Document : IStorable, ICompressible
ThcThiGiaoDin
180
NgnNgLpTrnhC#
Do Document cng phi thc thi nhng phng thc c xc nhn trong giao din
ICompressible:
public void Compress()
{
Console.WriteLine(Implementing the Compress Method);
}
public void Decompress()
{
Console.WriteLine(Implementing the Decompress Method);
}
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:
Creating document with: Test Document
Implementing the Read Method for IStorable
Implementing Compress
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:
interface ILoggedCompressible : ICompressible
{
void LogSavedBytes();
}
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
ThcThiGiaoDin
181
NgnNgLpTrnhC#
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:
interface IStorableCompressible : IStoreable, ILoggedCompressible
{
void LogOriginalSize();
}
V d 8.2: Minh ha vic m rng v kt hp cc giao din.
-----------------------------------------------------------------------------
using System;
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set;}
}
// giao din mi
interface ICompressible
{
void Compress();
void Decompress();
}
// m rng giao din
interface ILoggedCompressible : ICompressible
{
void LogSavedBytes();
}
// kt hp giao din
interface IStorableCompressible : IStorable, ILoggedCompressible
{
void LogOriginalSize();
}
interface IEncryptable
{
void Encrypt();
void Decrypt();
}
public class Document : IStorableCompressible, IEncryptable
{
ThcThiGiaoDin
182
NgnNgLpTrnhC#
// b khi to lp Document ly mt tham s
public Document( string s)
{
Console.WriteLine(Creating document with: {0}, s);
}
// thc thi giao din IStorable
public void Read()
{
Console.WriteLine(Implementing the Read Method for IStorable);
}
public void Write( object o)
{
Console.WriteLine(Implementing the Write Method for IStorable);
}
public int Status
{
get
{
return status;
}
set
{
status = value;
}
}
// thc thi ICompressible
public void Compress()
{
Console.WriteLine(Implementing Compress);
}
public void Decompress()
{
Console.WriteLine(Implementing Decompress);
}
// thc thi giao din ILoggedCompressible
public void LogSavedBytes()
{
Console.WriteLine(Implementing LogSavedBytes);
ThcThiGiaoDin
183
NgnNgLpTrnhC#
}
// thc thi giao din IStorableCompressible
public void LogOriginalSize()
{
Console.WriteLine(Implementing LogOriginalSize);
}
// thc thi giao din
public void Encrypt()
{
Console.WriteLine(Implementing Encrypt);
}
public void Decrypt()
{
Console.WriteLine(Implementing Decrypt);
}
// bin thnh vin lu d liu cho thuc tnh
private int status = 0;
}
public class Tester
{
public static void Main()
{
// to i tng document
Document doc = new Document(Test Document);
// gn i tng cho giao din
IStorable isDoc = doc as IStorable;
if ( isDoc != null)
{
isDoc.Read();
}
else
{
Console.WriteLine(IStorable not supported);
}
ICompressible icDoc = doc as ICompressible;
if ( icDoc != null )
{
icDoc.Compress();
ThcThiGiaoDin
184
NgnNgLpTrnhC#
}
else
{
Console.WriteLine(Compressible not supported);
}
ILoggedCompressible ilcDoc = doc as ILoggedCompressible;
if ( ilcDoc != null )
{
ilcDoc.LogSavedBytes();
ilcDoc.Compress();
// ilcDoc.Read(); // khng th gi c
}
else
{
Console.WriteLine(LoggedCompressible not supported);
}
IStorableCompressible isc = doc as IStorableCompressible;
if ( isc != null )
{
isc.LogOriginalSize(); // IStorableCompressible
isc.LogSavedBytes(); // ILoggedCompressible
isc.Compress(); // ICompress
isc.Read(); // IStorable
}
else
{
Console.WriteLine(StorableCompressible not supported);
}
IEncryptable ie = doc as IEncryptable;
if ( ie != null )
{
ie.Encrypt();
}
else
{
Console.WriteLine(Encryptable not supported);
}
}
ThcThiGiaoDin
185
NgnNgLpTrnhC#
}
-----------------------------------------------------------------------------
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 IStorable v giao din ICompressible. Sau
l phn m rng n giao din ILoggedCompressible ri 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 ILogged-
Compressible m rng v tha k cc phng thc t giao din c s:
ILoggedCompressible ilcDoc = doc as ILoggedCompressible;
if ( ilcDoc != null )
{
ilcDoc.LogSavedBytes();
ilcDoc.Compress();
// ilcDoc.Read(); // khng th gi c
}
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:
IStorableCompressible isc = doc as IStorableCompressible;
if ( isc != null )
{
isc.LogOriginalSize(); // IStorableCompressible
ThcThiGiaoDin
186
NgnNgLpTrnhC#
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 IStorable nh th l cc thnh vin
ca lp Document:
Document doc = new Document(Test Document);
doc.status = -1;
doc.Read();
hay l ta c th to th hin ca giao din bng cch gn i tng Document cho mt kiu
d liu giao din, v sau s dng giao din ny truy cp cc phng thc:
IStorable isDoc = (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:
IStorable isDoc = new IStorable();
Tuy nhin chng ta c th to th hin ca lp thc thi nh sau:
Document doc = new Document(Test Document);
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:
IStorable isDoc = (IStorable) doc;
Chng ta c th kt hp nhng bc trn nh sau:
IStorable isDoc = (IStorable) new Document(Test Document);
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, ICompressible cho nhng i tng nn d liu v truyn qua mail nhanh chng:
interface ICompressible
{
ThcThiGiaoDin
187
NgnNgLpTrnhC#
void Compress();
void Decompress();
}
Nu a ra mt kiu Document, v ta cng khng bit l lp ny c h tr giao din
IStorable hay ICompressible hoc c hai. Ta c th c on chng trnh sau:
Document doc = new Document(Test Document);
IStorable isDoc = (IStorable) doc;
isDoc.Read();
ICompressible icDoc = (ICompressible) doc;
icDoc.Compress();
Nu Document ch thc thi giao din IStorable:
public class Document : IStorable
php gn cho ICompressible vn c bin dch bi v ICompressible l 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):
A exception of type System.InvalidCastException was thrown.
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 is l:
<biu thc> is <kiu d liu>
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 IStorable hay
ICompressible.
V d 8.3: S dng ton t is.
-----------------------------------------------------------------------------
using System;
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set; }
}
// giao din mi
ThcThiGiaoDin
188
NgnNgLpTrnhC#
interface ICompressible
{
void Compress();
void Decompress();
}
// Document thc thi IStorable
public class Document : IStorable
{
public Document( string s)
{
Console.WriteLine(Creating document with: {0}, s);
}
// IStorable
public void Read()
{
Console.WriteLine(Implementing the Read Method for IStorable);
}
// IStorable.WriteLine()
public void Write( object o)
{
Console.WriteLine(Implementing the Write Method for IStorable);
}
// IStorable.Status
public int Status
{
get
{
return status;
}
set
{
status = value;
}
}
// bien thanh vien luu gia tri cua thuoc tinh Status
private int status = 0;
}
public class Tester
ThcThiGiaoDin
189
NgnNgLpTrnhC#
{
static void Main()
{
Document doc = new Document(Test Document);
// ch gn khi an ton
if ( doc is IStorable )
{
IStorable isDoc = (IStorable) doc;
isDoc.Read();
}
// vic kim tra ny s sai
if ( doc is ICompressible )
{
ICompressible icDoc = (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 ( doc is IStorable )
Biu thc iu kin s tr v gi tr true v 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 is a 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 ICompressible
IL_0028: brfalse.s IL_0039
IL_002a: ldloc.0
IL_002b: castclass ICompressible
IL_0030: stloc.2
IL_0031: ldloc.2
IL_0032: callvirt instance void ICompressible::Compress()
IL_0037: br.s IL_0043
IL_0039: ldstr Compressible not supported
iu quan trng xy ra l khi php kim tra ICompressible dng 23. T kha isinst l m
MSIL tng ng vi ton t is. Nu vic kim tra i tng (doc) ng kiu ca kiu bn
ThcThiGiaoDin
190
NgnNgLpTrnhC#
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 as tr v gi tr null.
Ghi ch: T kha null th hin mt tham chiu khng tham chiu n u c (null
reference). i tng c gi tr null tc 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 as nh sau:
<biu thc> as <kiu d liu>
on chng trnh sau thay th vic s dng ton t is bng ton t as v sau thc hin
vic kim tra xem giao din c gn c null hay khng:
static void Main()
{
Document doc = new Document(Test Document);
IStorable isDoc = doc as IStorable;
if ( isDoc != null )
{
isDoc.Read();
}
else
{
Console.WriteLine(IStorable not supported);
}
ICompressible icDoc = doc as ICompressible;
if ( icDoc != null)
{
icDoc.Compress();
}
else
{
Console.WriteLine(Compressible not supported);
}
ThcThiGiaoDin
191
NgnNgLpTrnhC#
}
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: isinst ICompressible
IL_0028: stloc.2
IL_0029: ldloc.2
IL_002a: brfalse.s IL_0034
IL_002c: ldloc.2
IL_002d: callvirt instance void ICompressible::Compress()
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 as l 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 is l 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 IStorable tr thnh mt lp tru tng:
abstract class Storable
{
abstract public void Read();
abstract public void Write();
}
By gi lp Document c 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 List v cng t IStorable. Ta c th to lp StorableList nh sau:
public class StorableList : List, IStorable
{
// phng thc List...
.....
ThcThiGiaoDin
192
NgnNgLpTrnhC#
public void Read()
{...}
public void Write( object o)
{...}
//....
}
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 cui
cng l c ph quyt trong kiu d liu Note c dn xut t Document.
V d 8.4: Ph quyt thc thi giao din.
-----------------------------------------------------------------------------
using System;
interface IStorable
{
void Read();
void Write();
}
// lp Document n gin thc thi giao din IStorable
public class Document : IStorable
{
// b khi dng
public Document( string s)
{
Console.WriteLine(Creating document with: {0}, s);
}
// nh du phng thc Read o
public virtual void Read()
{
Console.WriteLine(Document Read Method for IStorable);
ThcThiGiaoDin
193
NgnNgLpTrnhC#
}
// khng phi phng thc o
public void Write()
{
Console.WriteLine(Document Write Method for IStorable);
}
}
// lp dn xut t Document
public class Note : Document
{
public Note( string s) : base(s)
{
Console.WriteLine(Creating note with: {0}, s);
}
// ph quyt phng thc Read()
public override void Read()
{
Console.WriteLine(Overriding the Read Method for Note!);
}
// thc thi mt phng thc Write ring ca lp
public void Write()
{
Console.WriteLine(Implementing the Write method for Note!);
}
}
public class Tester
{
static void Main()
{
// to mt i tng Document
Document theNote = new Note(Test Note);
IStorable isNote = theNote as IStorable;
if ( isNote != null)
{
isNote.Read();
isNote.Write();
}
Console.WriteLine(\n);
ThcThiGiaoDin
194
NgnNgLpTrnhC#
// trc tip gi phng thc
theNote.Read();
theNote.Write();
Console.WriteLine(\n);
// to i tng Note
Note note2 = new Note(Second Test);
IStorable isNote2 = note2 as IStorable;
if ( isNote != null )
{
isNote2.Read();
isNote2.Write();
}
Console.WriteLine(\n);
// trc tip gi phng thc
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 Document thc thi mt giao din n gin l IStorable:
interface IStorable
ThcThiGiaoDin
195
NgnNgLpTrnhC#
{
void Read();
void Write();
}
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:
public virtual void Read()
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 Note dn xut t Document:
public class Note : Document
Vic ph quyt phng thc Read() trong lp Note l khng cn thit, nhng y ta t do
lm iu ny:
public override void Read()
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 Document c to ra, v a ch ca mt i
tng mi l lp dn xut Note c to trn heap v gn tr li cho i tng Document:
Document theNote = new Note(Test Note);
Mt tham chiu giao din c to ra v ton t as c s dng gn Document cho tham
chiu giao din IStorable:
IStorable isNote = theNote as IStorable;
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:
Overriding the Read method for Note!
Document Write Method for IStorable
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:
Overriding the Read method for Note!
Document Write Method for IStorable
ThcThiGiaoDin
196
NgnNgLpTrnhC#
Trong trng hp ny, phng thc Read() ca lp Note c gi, v phng thc Write()
ca lp Document c gi.
chng t rng kt qu ny ca phng thc ph quyt, chng ta tip tc to i tng
Note th 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):
Note note2 = new Note(Second Test);
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 Note c gi ch khng phi ca mt
phng thc Document:
Overriding the Read method for Note!
Implementing the Write method dor Note!
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: IStorable v 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
Document phi thc thi.
Bi v c hai phng thc IStorable v ITalk c cng phng thc Read(),vic thc thi lp
Document phi s dng thc thi tng minh cho mi phng thc. Vi vic thc thi tng
minh, lp thc thi Document s khai bo tng minh cho mi phng thc:
void ITalk.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:
public void Talk();
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:
void ITalk.Read();
Phng thc ny c hiu ngm l public.
ThcThiGiaoDin
197
NgnNgLpTrnhC#
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:
ITalk itDoc = theDoc as ITalk;
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.
-----------------------------------------------------------------------------
using System;
interface IStorable
{
void Read();
void Write();
}
interface ITalk
{
void Talk();
void Read();
}
// lp Document thc thi hai giao din
public class Document : IStorable, ITalk
{
// b khi dng
public Document( string s)
{
Console.WriteLine(Creating document with: {0},s);
}
// to phng thc o
public virtual void Read()
{
ThcThiGiaoDin
198
NgnNgLpTrnhC#
Console.WriteLine(Implementing IStorable.Read);
}
// thc thi bnh thng
public void Write()
{
Console.WriteLine(Implementing IStorable.Write);
}
// thc thi tng minh
void ITalk.Read()
{
Console.WriteLine(Implementing ITalk.Read);
}
public void Talk()
{
Console.WriteLine(Implementing ITalk.Talk);
}
}
public class Tester
{
static void Main()
{
// to i tng Document
Document theDoc = new Document(Test Document);
IStorable isDoc = theDoc as IStorable;
if ( isDoc != null )
{
isDoc.Read();
}
ITalk itDoc = theDoc as ITalk;
if ( itDoc != null )
{
itDoc.Read();
}
theDoc.Read();
theDoc.Talk();
}
}
-----------------------------------------------------------------------------
ThcThiGiaoDin
199
NgnNgLpTrnhC#
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 Document th
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 Document v 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
Document thc 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
IBase vi mt thuc tnh P:
interface IBase
ThcThiGiaoDin
200
NgnNgLpTrnhC#
{
int P { 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 P vi mt phng thc mi P():
interface IDerived : IBase
{
new int P();
}
Vic ci t ny l mt tng tt, by gi chng ta c th n thuc tnh P trong 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:
class myClass : IDerived
{
// thc thi tng minh cho thuc tnh c s
int IBase.p { get{...}}
// thc thi ngm nh phng thc dn xut
public int P() {...}
}
class myClass : IDerived
{
// thc thi ngm nh cho thuc tnh c s
public int P { get{...}}
// thc thi tng minh phng thc dn xut
int IDerived.P() {...}
}
class myClass : IDerived
{
// thc thi tng minh cho thuc tnh c s
int IBase.P { get{...}}
// thc thi tng minh phng thc dn xut
int IDerived.P(){...}
}
Truy cp lp khng cho dn xut v kiu gi tr
ThcThiGiaoDin
201
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
using System;
// khai bo mt giao din n
interface IStorable
{
void Read();
int Status { get; set;}
}
// thc thi thng qua cu trc
public struct myStruct : IStorable
{
public void Read()
{
Console.WriteLine(Implementing IStorable.Read);
}
public int Status
{
get
{
return status;
}
set
{
status = value;
}
}
ThcThiGiaoDin
202
NgnNgLpTrnhC#
// bin thnh vin lu gi tr thuc tnh Status
private int status;
}
public class Tester
{
static void Main()
{
// to mt i tng myStruct
myStruct theStruct = new myStruct();
theStruct.Status = -1; // khi to
Console.WriteLine(theStruct.Status: {0}, theStruct.Status);
// thay i gi tr
theStruct.Status = 2;
Console.WriteLine(Changed object);
Console.WriteLine(theStruct.Status: {0}, theStruct.Status);
// gn cho giao din
// boxing ngm nh
IStorable isTemp = (IStorable) theStruct;
// thit lp gi tr thng qua tham chiu giao din
isTemp.Status = 4;
Console.WriteLine(Changed interface);
Console.WriteLine(theStruct.Status: {0}, isTemp: {1},
theStruct.Status, isTemp.Status);
// thay i gi tr mt ln na
theStruct.Status = 6;
Console.WriteLine(Changed object.);
Console.WriteLine(theStruct.Status: {0}, isTemp: {1},
theStruct.Status, isTemp.Status);
}
}
-----------------------------------------------------------------------------
Kt qu:
theStruct.Status: -1
Changed object.
theStruct.Status: 2
Changed interface
theStruct.Status: 2, isTemp: 4
Changed object
ThcThiGiaoDin
203
NgnNgLpTrnhC#
theStruct.Status: 6, isTemp: 4
-----------------------------------------------------------------------------
Trong v d 8.6, giao din IStorable c mt phng thc Read() v mt thuc tnh l Status.
Giao din ny c thc thi bi mt cu trc tn l myStruct:
public struct myStruct : 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 status c in ra:0
myStruct theStruct = new myStruct();
theStruct.Status = -1; // khi to
Console.WriteLine(theStruct.Status: {0}, theStruct.status);
Kt qu l gi tr ca status c 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:
// thay i gi tr
theStruct.Status = 2;
Console.WriteLine(Changed object);
Console.WriteLine(theStruct.Status: {0}, theStruct.Status);
kt qu ch ra s thay i:
Changed object
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 status bng 4:
// gn cho mt giao din
// boxing ngm nh
IStorable isTemp = (IStorable) theStruct;
// thit lp gi tr thng qua tham chiu giao din
isTemp.Status = 4;
Console.WriteLine(Changed interface);
Console.WriteLine(theStruct.Status: {0}, isTemp: {1},
theStruct.Status, isTemp.Status);
nh chng ta thy kt qu thc hin c mt im khc bit:
Changed interface
theStruct.Status: 2, isTemp: 4
iu xy ra l: i tng c giao din tham chiu n thay i gi tr status bng 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:
ThcThiGiaoDin
204
NgnNgLpTrnhC#
// than i gi tr ln na
theStruct.Status = 6;
Console.WriteLine(Changed object);
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:
Changed object
theStruct.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.
-----------------------------------------------------------------------------
method private hidebysig static void Main() il managed
{
.entrypoint
// Code size 206 (0xce)
.maxstack 4
.local ([0] value class myStruct theStruct,
[1] class IStorable isTemp,
[2] int32 V_2)
IL_0000: ldloca.s theStruct
IL_0002: iniobj myStruct
IL_0008: ldloca.s theStruct
IL_000a: ldc.i4.ml
IL_000b: call instance void myStruct::set_status(int32)
IL_0010: ldstr theStruct.Status: {0}
IL_0015: ldloca.s theStruct
IL_0017: call instance int32 myStruct::get_status()
IL_001c: stloc.2
IL_001d: ldloca.s V_2
IL_001f: box [mscorlib]System.Int32
IL_0024: call void [mscorlib] System.Console::WriteLine
(class System.String, class System.Object)
IL_0029: ldloca.s theStruct
IL_002b: ldc.i4.2
IL_002c: call instance void myStruct::set_status(int32)
ThcThiGiaoDin
205
NgnNgLpTrnhC#
IL_0031: ldstr Changed object
IL_0036: call void [mscorlib]System.Console::WriteLine
(class System.String)
IL_003b: ldstr theStruct.Status: {0}
IL_0040: ldloca.s theStruct
IL_0042: call instance int32 myStruct::get_status()
IL_0047: stloc.2
IL_0048: ldloca.s V_2
IL_004a: box [mscorlib]System.Int32
IL_004f: call void [mscorlib]System.Console::WriteLine
(class System.String, class System.Object)
IL_0054: ldloca.s theStruct
IL_0056: box myStruct
IL_005b: stloc.1
IL_005c: ldloc.1
IL_005d: ldc.i4.4
IL_005e: callvirt instance void IStorable::set_status(int32)
IL_0063: ldstr Changed interface
IL_0068: call void [mscorlib]System.Console::WriteLine
(class System.String)
IL_006d: ldstr theStruct.Status: {0}, isTemp: {1}
IL_0072: ldloca.s theStruct
IL_0074: call instance int32 mySystem::get_status()
IL_0079: stloc.2
IL_007a: ldloca.s V_2
IL_007c: box [mscorlib]System.Int32
IL_0081: ldloc.1
IL_0082: callvirt instance int32 IStorable::get_status()
IL_0087: stloc.2
IL_0088: ldloca.s V_2
IL_008a: box [mscorlib]System.Int32
IL_008f: call void [mscorlib]System.Console::WriteLine
(class System.String, class System.Object, class System.Object)
IL_0094: ldloca.s theStruct
IL_0096: ldc.i4.6
IL_0097: call instance void myStruct::set_status(int32)
IL_009c: ldstr Changed object
IL_00a1: call void [mscorlib]System.Console::WriteLine
ThcThiGiaoDin
206
NgnNgLpTrnhC#
(class System.String)
IL_00a6: ldstr theStruct.Status: {0}, isTemp: {1}
IL_00ab: ldloca.s theStruct
IL_00ad: call instance int32 myStruct::get_status()
IL_00b2: stloc.2
IL_00b3: ldloca.s V_2
IL_00b5: box [mscorlib]System.Int32
IL_00ba: ldloc.1
IL_00bb: callvirt instance int32 IStorable::get_status()
IL_00c0: stloc.2
IL_00c1: ldloca.s V_2
IL_00c3: box [mscorlib]System.Int32
IL_00c8: call void [mscorlib]System.Console::WriteLine
(class System.String, class System.Object, class System.Object)
IL_00cd: ret
} // end fo method Tester::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 GetString ca lp object c 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_005e lc ny IStorable::set_status c 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
Cu hi 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.
ThcThiGiaoDin
207
NgnNgLpTrnhC#
Cu hi 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.
Cu hi 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.
Cu hi 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
Cu hi 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.
Cu hi 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
Cu hi 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?
Cu hi 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?
Cu hi 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?
-----------------------------------------------------------------------------
public interface IDimensions
{
ThcThiGiaoDin
208
NgnNgLpTrnhC#
long width;
long height;
double Area();
double Circumference();
int Side();
}
-----------------------------------------------------------------------------
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.
-----------------------------------------------------------------------------
using System;
interface IPoint
{
// Property signatures:
int x
{
get;
set;
}
int y
{
get;
set;
}
}
class MyPoint : IPoint
{
// Fields:
private int myX;
private int myY;
// Constructor:
public MyPoint(int x, int y)
{
myX = x;
myY = y;
}
// Property implementation:
public int x
ThcThiGiaoDin
209
NgnNgLpTrnhC#
{
get
{
return myX;
}
set
{
myX = value;
}
}
public int y
{
get
{
return myY;
}
set
{
myY = value;
}
}
}
class MainClass
{
private static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
}
public static void Main()
{
MyPoint p = new MyPoint(2,3);
Console.Write("My Point: ");
PrintPoint(p);
IPoint p2 = new IPoint();
PrintPoint(p2);
}
}
-----------------------------------------------------------------------------
ThcThiGiaoDin
210
NgnNgLpTrnhC#
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.
ThcThiGiaoDin
211
NgnNgLpTrnhC#
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 tnh ging nhau tr
nn n gin hn, mt lp c ch mc th ging nh mt mng.
Mng,ChMc,vTpHp
212
NgnNgLpTrnhC#
.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 M t
BinarySearch() Phng thc tnh public tm kim mt mng mt chiu
sp th t.
Clear() Phng thc tnh public thit lp cc thnh phn ca mng
v 0 hay null.
Copy() Phng thc tnh public np chng thc hin sao chp
mt vng ca mng vo mng khc.
CreateInstance() Phng thc tnh public np chng to mt th hin mi
cho mng
IndexOf() Phng thc tnh public tr v ch mc ca th hin u tin
cha gi tr trong mng mt chiu
LastIndexOf() Phng thc tnh public tr v ch mc ca th hin cui
cng ca gi tr trong mng mt chiu
Reverse() Phng thc tnh public o th t ca cc thnh phn trong
mng mt chiu
Sort() Phng thc tnh public sp xp gi tr trong mng mt
chiu.
IsFixedSize Thuc tnh public gi tr bool th hin mng c kch thc
c nh hay khng.
IsReadOnly Thuc tnh public gi tr bool th hin mng ch c hay
khng
Mng,ChMc,vTpHp
213
NgnNgLpTrnhC#
IsSynchronized Thuc tnh public gi tr bool th hin mng c h tr
thread-safe
Length Thuc tnh public chiu di ca mng
Rank Thuc tnh public cha s chiu ca mng
SyncRoot Thuc tnh public cha i tng dng ng b truy cp
trong mng
GetEnumerator() Phng thc public tr v IEnumerator
GetLength() Phng thc public tr v kch thc ca mt chiu c nh
trong mng
GetLowerBound() Phng thc public tr v cn di ca chiu xc nh trong
mng
GetUpperBound() Phng thc public tr v cn trn ca chiu xc nh trong
mng
Initialize() Khi to tt c gi tr trong mng kiu gi tr bng cch gi
b khi dng mc nh ca tng gi tr.
SetValue() Phng thc public thit lp gi tr cho mt thnh phn xc
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:
<kiu d liu>[] <tn mng>
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.
myIntArray c khai bo l mng s nguyn.
Chng ta to th hin ca mng bng cch s dng t kha new nh sau:
myIntArray = new int[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
Mng,ChMc,vTpHp
214
NgnNgLpTrnhC#
myIntArray l 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 = new int[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 Button vi
c php sau:
Button[] myButtonArray;
v chng ta to th hin ca mng nh sau:
myButtonArray = new Button[3];
Ghi ch: chng ta c th vit ngn gn nh sau:
Button muButtonArray = new Button[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
myButtonArray vi 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 Tester to ra mt mng kiu Employee v mt mng s nguyn. To cc i
tng Employee sau in hai mng ra mn hnh.
Mng,ChMc,vTpHp
215
NgnNgLpTrnhC#
V d 9.1: lm vic vi mt mng.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to mt lp n gin lu tr trong mng
public class Employee
{
// b khi to ly mt tham s
public Employee( int empID )
{
this.empID = empID;
}
public override string ToString()
{
return empID.ToString();
}
// bin thnh vin private
private int empID;
private int size;
}
public class Tester
{
static void Main()
{
int[] intArray;
Employee[] empArray;
intArray = new int[5];
empArray = new Employee[3];
// to i tng a vo mng
for( int i = 0; i < empArray.Length; i++)
{
empArray[i] = new Employee(i+5);
}
// xut mng nguyn
for( int i = 0; i < intArray.Length; i++)
{
Console.Write(intArray[i].ToString()+\t);
Mng,ChMc,vTpHp
216
NgnNgLpTrnhC#
}
// xut mng Employee
for( int i = 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 Object c ph quyt
in ra gi tr empID ca 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 Employee
c 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 = new int[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:
public void DisplayVals( params int[] intVals)
Mng,ChMc,vTpHp
217
NgnNgLpTrnhC#
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 (int i in intVals)
{
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 = new int[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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Tester
{
static void Main()
{
Tester t = new Tester();
t.DisplayVals(5,6,7,8);
int[] explicitArray = new int[5] {1,2,3,4,5};
t.DisplayVals(explicitArray);
}
public void DisplayVals( params int[] intVals)
{
foreach (int i in intVals)
{
Console.WriteLine(DisplayVals {0}, i);
}
}
}
}
Mng,ChMc,vTpHp
218
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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 foreach nh sau:
foreach (<kiu d liu thnh phn> <tn truy cp> in <mng/tp hp> )
{
// thc hin thng qua <tn truy cp> tng ng vi
// tng mc trong mng hay tp hp
}
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to mt lp n gin lu tr trong mng
public class Employee
{
// b khi to ly mt tham s
public Employee( int empID )
{
this.empID = empID;
}
Mng,ChMc,vTpHp
219
NgnNgLpTrnhC#
public override string ToString()
{
return empID.ToString();
}
// bin thnh vin private
private int empID;
private int size;
}
public class Tester
{
static void Main()
{
int[] intArray;
Employee[] empArray;
intArray = new int[5];
empArray = new Employee[3];
// to i tng a vo mng
for( int i = 0; i < empArray.Length; i++)
{
empArray[i] = new Employee(i+10);
}
// xut mng nguyn
foreach (int i in intArray)
{
Console.Write(i.ToString()+\t);
}
// xut mng Employee
foreach ( Employee e in empArray)
{
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:
Mng,ChMc,vTpHp
220
NgnNgLpTrnhC#
for (int i = 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 ( Employee e in empArray)
{
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 public ca 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:
<kiu d liu> [,] <tn mng>
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;
Mng,ChMc,vTpHp
221
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Tester
{
static void Main()
{
// khai bo s dng v s ct ca mng
const int rows = 4;
const int columns = 3;
// khai bo mng 4x3 s nguyn
int [,] rectangularArray = new int[rows, columns];
// khi to cc thnh phn trong mng
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < columns; j++)
{
rectangularArray[i,j] = i+j;
}
}
// xut ni dung ra mn hnh
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < columns; j++)
{
Console.WriteLine(rectangularArray[{0},{1}] = {2},
i, j, rectangularArray[i, j]);
}
}
}
}
}
Mng,ChMc,vTpHp
222
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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:
const int rows = 4;
const int columns = 3;
hai gi tr ny c s dng khai bo s chiu ca mng:
int [,] rectangularArray = new int[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 new int
[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 to l
rectangularArray[0,0], tip theo bi rectangularArray[0,1] v n rectangularArray[0,2].
Mt khi iu ny thc hin xong th chng trnh s chuyn qua thc hin tip dng tip
tc: rectangularArray[1,0], rectangularArray[1,1], rectangularArray[1,2]. Cho n khi tt
c cc ct trong tt c cc dng c duyt qua tc l tt c cc thnh phn trong mng
c khi to.
Nh chng ta bit, chng ta c th khi to mng mt chiu bng cch s dng danh sch
cc gi tr bn trong du ngoc ({}). Chng ta cng c th lm tng t vi mng hai chiu.
Trong v d 9.5 khai bo mng hai chiu rectangularArray, v khi to cc thnh phn ca n
thng qua cc danh sch cc gi tr trong ngoc, sau in ra ni dung ca ni dung.
V d 9.5: Khi to mng a chiu.
-----------------------------------------------------------------------------
Mng,ChMc,vTpHp
223
NgnNgLpTrnhC#
namespace Programming_CSharp
{
using System;
public class Tester
{
static void Main()
{
// khai bo bin lu s dng s ct mng
const int rows = 4;
const int columns = 3;
// khai bo v nh ngha mng 4x3
int[,] rectangularArray = {
{0,1,2}, {3,4,5}, {6,7,8},{9,10,11}
};
// xt ni dung ca mng
for( int i = 0; i < rows; i++)
{
for(int j = 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
rectangularArray[2,2] = 8
rectangularArray[3,0] = 9
Mng,ChMc,vTpHp
224
NgnNgLpTrnhC#
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:
<kiu d liu> [] [] ...
V d, chng ta c th khai bo mng s nguyn hai chiu khc kch thc tn myJagged-
Array nh sau:
int [] [] myJaggedArray;
Chng ta c th truy cp thnh phn th nm ca mng th ba bng c php: myJagged-
Array[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.
Mng,ChMc,vTpHp
225
NgnNgLpTrnhC#
V d 9.6: Mng khc chiu.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Tester
{
static void Main()
{
const int rows = 4;
// khai bo mng ti a bn dng
int[][] jaggedArray = new int[rows][];
// dng u tin c 5 phn t
jaggedArray[0] = new int[5];
// dng th hai c 2 phn t
jaggedArray[1] = new int[2];
// dng th ba c 3 phn t
jaggedArray[2] = new int[3];
// dng cui cng c 5 phn t
jaggedArray[3] = new int[5];
// khi to mt vi gi tr cho cc thnh phn ca mng
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(int i = 0; i < 5; i++)
{
Console.WriteLine(jaggedArray[0][{0}] = {1},
i, jaggedArray[0][i]);
}
for(int i = 0; i < 2; i++)
{
Console.WriteLine(jaggedArray[1][{0}] = {1},
Mng,ChMc,vTpHp
226
NgnNgLpTrnhC#
i, jaggedArray[1][i]);
}
for(int i = 0; i < 3; i++)
{
Console.WriteLine(jaggedArray[2][{0}] = {1},
i, jaggedArray[2][i]);
}
for(int i = 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 = new int[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:
Mng,ChMc,vTpHp
227
NgnNgLpTrnhC#
// dng u tin c 5 phn t
jaggedArray[0] = new int[5];
// dng th hai c 2 phn t
jaggedArray[1] = new int[2];
// dng th ba c 3 phn t
jaggedArray[2] = new int[3];
// dng cui cng c 5 phn t
jaggedArray[3] = new int[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 Button n mt mng nhng i tng.
V d 9.7: Chuyn i gia nhng mng.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to lp lu tr trong mng
public class Employee
{
public Employee( int empID)
{
this.empID = empID;
}
Mng,ChMc,vTpHp
228
NgnNgLpTrnhC#
public override string ToString()
{
return empID.ToString();
}
// bin thnh vin
private int empID;
private int size;
}
public class Tester
{
// phng thc ny ly mt mng cc object
// chng ta truyn vo mng cc i tng Employee
// v sau l mng cc string, c s chuyn i ngm
// v c hai iu dn xut t lp object
public static void PrintArray(object[] theArray)
{
Console.WriteLine(Contents of the Array: {0}, theArray.ToString());
// in ra tng thnh phn trong mng
foreach (object obj in theArray)
{
// trnh bin dch s gi obj.ToString()
Console.WriteLine(Value: {0}, obj);
}
}
static void Main()
{
// to mng cc i tng Employee
Employee[] myEmployeeArray = new Employee[3];
// khi to cc i tng ca mng
for (int i = 0; i < 3; i++)
{
myEmployeeArray[i] = new Employee(i+5);
}
// hiu th gi tr ca mng
PrintArray( myEmployeeArray );
// to mng gm hai chui
string[] array ={ hello, world};
// xut ra ni dung ca chui
Mng,ChMc,vTpHp
229
NgnNgLpTrnhC#
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 Tester
by 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:
public static void PrintMyArray( object[] theArray)
object l 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 string v Employee.
Phng thc PrintArray thc hin hai hnh ng. u tin, l gi phng thc ToString()
ca mng:
Console.WriteLine(Contents of the Array {0}, theArray.ToString());
Tn ca kiu d liu mng c in ra:
Contents of the Array Programming_CSharp.Employee[]
...
Contents of the Array System.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 ToString() ca lp
Employee c gi. Vic gi ToString() c th khng cn thit, 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
Mng,ChMc,vTpHp
230
NgnNgLpTrnhC#
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().
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Tester
{
public static void PrintArray(object[] theArray)
{
foreach( object obj in theArray)
{
Console.WriteLine(Value: {0}, obj);
}
Console.WriteLine(\n);
}
static void Main()
{
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( myOtherArray );
Array.Sort( myOtherArray );
PrintArray( myOtherArray );
}
}
}
-----------------------------------------------------------------------------
Mng,ChMc,vTpHp
231
NgnNgLpTrnhC#
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: Mun
Value: Kitty
Value: is
Mng,ChMc,vTpHp
232
NgnNgLpTrnhC#
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: la
Value: lap
Value: 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 private myStrings. 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:
string theFirstString = myListBox[0];
string theLastString = myListBox[myListBox.Length - 1];
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:
<kiu d liu> this [<kiu d liu> <i mc>]
{ 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
Mng,ChMc,vTpHp
233
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to lp ListBox
public class ListBoxTest
{
// khi to ListBox vi mt chui
public ListBoxTest( params string[] initialStrings)
{
// cp pht khng gian cho chui
strings = new String[256];
// copy chui truyn t tham s
foreach ( string s in initialStrings)
{
strings[ctr++] = s;
}
}
// thm mt chui
public void Add(string theString)
{
if (ctr >= strings.Length)
{
// x l khi ch mc sai
}
else
strings[ctr++] = theString;
Mng,ChMc,vTpHp
234
NgnNgLpTrnhC#
}
// thc hin b truy cp
public string this[int index]
{
get
{
if ( index < 0 || index >= strings.Length)
{
// x l ch mc sai
}
return strings[index];
}
set
{
if ( index >= ctr)
{
// x l li ch mc khng tn ti
}
else
strings[index] = value;
}
}
// ly s lng chui c lu gi
public int GetNumEntries()
{
return ctr;
}
// cc bin thnh vn lu gi mng cho b ch mc
private string[] strings;
private int ctr = 0;
}
// lp thc thi
public class Tester
{
static void Main()
{
// to mt i tng ListBox mi v khi to
ListBoxTest lbt = new ListBoxTest(Hello,World);
Mng,ChMc,vTpHp
235
NgnNgLpTrnhC#
// thm mt s chui vo lbt
lbt.Add(Who);
lbt.Add(is);
lbt.Add(Ngoc);
lbt.Add(Mun);
// dng b ch mc
string strTest = Universe;
lbt[1] = strTest;
// truy cp v xut tt c cc chui
for(int i = 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 ctr m s chui c cha trong mng myStrings.
Chng ta khi to mt mng ti a 256 chui nh sau:
myStrings = new String[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 params nh m t trong phn trc ca chng.
Phng thc Add() ca ListBoxTest khng lm g khc hn l thm mt chui mi vo bn
trong mng myStrings.
Tuy nhin phng thc quan trng ca ListBoxTest l b ch mc. Mt b ch mc th khng
c tn nn ta dng t kha this:
public string this [int index]
Mng,ChMc,vTpHp
236
NgnNgLpTrnhC#
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)
{
// x l ch mc sai
}
return myStrings[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 value c s dng tham chiu n tham s a vo trong php
gn ca thuc tnh:
set
{
if ( index >= ctr)
{
// ch mc khng tn ti
}
}
Do vy, nu chng ta vit:
myStrings[10] = Hello C#;
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 Length ca b m hn l gi tr hin thi ca b m s i tng.
Mng,ChMc,vTpHp
237
NgnNgLpTrnhC#
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)
{
// ch mc vt qu s ti a ca mng
}
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
Mng,ChMc,vTpHp
238
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// to lp List Box
public class ListBoxTest
{
// khi to vi nhng chui
public ListBoxTest(params string[] initialStrings)
{
// cp pht chui
strings = new String[256];
// copy cc chui truyn vo
foreach( string s in initialStrings)
{
strings[ctr++] = s;
}
}
// thm mt chui vo cui danh sch
public void Add( string theString)
{
strings[ctr] = theString;
ctr++;
}
// b ch mc
public string this [ int index ]
{
get
{
if (index < 0 || index >= strings.Length)
Mng,ChMc,vTpHp
239
NgnNgLpTrnhC#
{
// ch mc khng hp l
}
return strings[index];
}
set
{
strings[index] = value;
}
}
private int findString( string searchString)
{
for(int i = 0; i < strings.Length; i++)
{
if ( strings[i].StartsWith(searchString))
{
return i;
}
}
return -1;
}
// b ch mc dng chui
public string this [string index]
{
get
{
if (index.Length == 0)
{
// x l khi chui rng
}
return this[findString(index)];
}
set
{
strings[findString(index)] = value;
}
}
// ly s chui trong mng
Mng,ChMc,vTpHp
240
NgnNgLpTrnhC#
public int GetNumEntries()
{
return ctr;
}
// bin thnh vin lu gi mng cc chui
private string[] strings;
// bin thnh vin lu gia s chui trong mng
private int ctr = 0;
}
public class Tester
{
static void Main()
{
// to i tng List Box v sau khi to
ListBoxTest lbt = new ListBoxTest(Hello,World);
// thm cc chui vo
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!;
// ly tt c cc chui ra
for(int i = 0; i < lbt.GetNumEntries();i++)
{
Console.WriteLine(lbt[{0}] = {1}, i, lbt[i]);
}
}
}
}
-----------------------------------------------------------------------------
Kt qu:
lbt[0]: Hi
lbt[1]: Universe
lbt[2]: Who
Mng,ChMc,vTpHp
241
NgnNgLpTrnhC#
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 strings cho 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:
return this[ 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 Mc ch
IEnumerable Lit k thng qua mt tp hp bng cch s dng
foreach.
ICollection Thc thi bi tt c cc tp hp cung cp phng
thc CopyTo() cng nh cc thuc tnh Count,
ISReadOnly, ISSynchronized, v SyncRoot.
IComparer So snh gia hai i tng lu gi trong tp hp
sp xp cc i tng trong tp hp.
IList S dng bi nhng tp hp mng c ch mc
Mng,ChMc,vTpHp
242
NgnNgLpTrnhC#
IDictionary Dng trong cc tp hp da trn kha v gi tr nh
Hashtable v SortedList.
IDictionaryEnumerator 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 Enumerable l n c th cung cp mt Enumerator:
public IEnumerator GetEnumerator()
{
return (IEnumerator) new ListBoxEnumerator(this);
}
Enumerator phi 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 Enumerator hn l vic phn vo trong cc lp cha.
Do lp Enumerator c xc nh cho lp cha, v theo nh trn th lp ListBoxEnumerator
phi 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 List-
BoxTest hin thi (this) cho enumerator. iu ny cho php enumerator c th lit k c
cc thnh phn trong tp hp ca i tng ListBoxTest. y lp thc thi Enumerator l
ListBoxEnumerator, y l mt lp private c nh ngha bn trong lp ListBoxTest. Lp
ny thc thi n gin bao gm mt thuc tnh public, v hai phng thc public l
MoveNext(), 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
enumerator i tng:
public ListBoxEnumerator(ListBoxTest lbt)
{
this.lbt = lbt;
index = -1;
}
Phng thc MoveNext() gia tng index v sau kim tra m bo rng vic thc hin
khng vt qu s phn t trong tp hp ca i tng:
public bool MoveNext()
Mng,ChMc,vTpHp
243
NgnNgLpTrnhC#
{
index++;
if (index >= lbt.strings.Length)
return false;
else
return true;
}
Phng thc IEnumerator.Reset() khng lm g c nhng thit lp li gi tr ca index l -1.
Thuc tnh Current tr 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 ListBox h tr enumerator.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
// to mt control n gin
public class ListBoxTest: IEnumerable
{
// lp thc thi ring ListBoxEnumerator
private class ListBoxEnumerator : IEnumerator
{
public ListBoxEnumerator(ListBoxTest lbt)
{
this.lbt = lbt;
index = -1;
}
// gia tng index v m bo gi tr ny hp l
public bool MoveNext()
{
index++;
if (index >= lbt.strings.Length)
return false;
else
return true;
}
Mng,ChMc,vTpHp
244
NgnNgLpTrnhC#
public void Reset()
{
index = -1;
}
public object Current
{
get
{
return( lbt[index]);
}
}
private ListBoxTest lbt;
private int index;
}
// tr v Enumerator
public IEnumerator GetEnumerator()
{
return (IEnumerator) new ListBoxEnumerator(this);
}
// khi to listbox vi chui
public ListBoxTest (params string[] initStr)
{
strings = new String[10];
// copy t mng chui tham s
foreach (string s in initStr)
{
strings[ctr++] = s;
}
}
public void Add(string theString)
{
strings[ctr] = theString;
ctr++;
}
// cho php truy cp ging nh mng
public string this[int index]
{
get
Mng,ChMc,vTpHp
245
NgnNgLpTrnhC#
{
if ( index < 0 || index >= strings.Length)
{
// x l index sai
}
return strings[index];
}
set
{
strings[index] = value;
}
}
// s chui nm gi
public int GetNumEntries()
{
return ctr;
}
private string[] strings;
private int ctr = 0;
}
public class Tester
{
static void Main()
{
ListBoxTest lbt = new ListBoxTest(Hello, World);
lbt.Add(What);
lbt.Add(Is);
lbt.Add(The);
lbt.Add(C);
lbt.Add(Sharp);
string subst = Universe;
lbt[1] = subst;
// truy cp tt c cc chui
int count =1;
foreach (string s in lbt)
{
Console.WriteLine(Value {0}: {1},count, s);
count++;
Mng,ChMc,vTpHp
246
NgnNgLpTrnhC#
}
}
}
}
-----------------------------------------------------------------------------
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 ListBoxTest mi 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 foreach c gi truy cp tng chui trong ListBox. Vng lp foreach t
ng s dng giao din IEnumerator bng cch gi phng thc GetEnumerator(). Mt i
tng ListBoxEnumerator c to ra v gi tr index = -1 c thit lp trong b khi to.
Vng lp foreach sau gi phng thc MoveNext(), khi index s c gia tng n 0
v tr v true. Khi foreach s dng thuc tnh Current nhn li chui hin hnh.
Thuc tnh Current gi 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 list box 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
Mng,ChMc,vTpHp
247
NgnNgLpTrnhC#
thc CopyTo(). Thuc tnh thng c s dng l Count, thuc tnh ny tr v s thnh
phn trong tp hp:
for(int i = 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 IComparer cung 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 Comparer thc thi IComparable v 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 Mc ch
Adapter() Phng thc static to mt wrapper ArrayList cho 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
thm hay xa.
Mng,ChMc,vTpHp
248
NgnNgLpTrnhC#
ReadOnly() Phng thc static np chng tr v danh sch lp nh l
mt wrapper, ch cho php c.
Repeat() Phng thc static tr v mt ArrayList m nhng thnh
phn ca n c sao chp vi gi tr xc nh.
Synchronized() Phng thc static tr v danh sch wrapper c thread-
safe
Capacity Thuc tnh get hay set s thnh phn trong ArrayList.
Count Thuc tnh nhn s thnh phn hin thi trong mng
IsFixedSize Thuc tnh kim tra xem kch thc ca ArrayList c c
nh hay khng
IsReadOnly Thuc tnh kim tra xem ArrayList c thuc tnh ch c
hay khng.
IsSynchronized Thuc tnh kim tra xem ArrayList c thread-safe hay
khng
Item() Thit lp hay truy cp thnh phn trong mng ti v tr xc
nh. y l b ch mc cho lp ArrayList.
SyncRoot Thuc tnh tr v i tng c th c s dng ng
b truy cp n ArrayList
Add() Phng thc public thm mt i tng vo ArrayList
AddRange() Phng thc public thm nhiu thnh phn ca mt
ICollection vo cui ca ArrayList
BinarySearch() Phng thc np chng public s dng tm kim nh phn
nh v mt thnh phn xc nh trong ArrayList c
sp xp.
Clear() Xa tt c cc thnh phn t ArrayList
Clone() To mt bn copy
Contains() Kim tra mt thnh phn xem c cha trong mng hay
khng
CopyTo() Phng thc public np chng sao chp mt ArrayList
n mt mng mt chiu.
GetEnumerator() Phng thc public np chng tr v mt enumerator dng
lp qua mng
GetRange() Sao chp mt dy cc thnh phn n mt ArrayList mi
IndexOf() Phng thc public np chng tr v ch mc v tr u tin
xut hin gi tr
Insert() Chn mt thnh phn vo trong ArrayList
InsertRange(0 Chn mt dy tp hp vo trong ArrayList
Mng,ChMc,vTpHp
249
NgnNgLpTrnhC#
LastIndexOf() Phng thc public np chng tr v ch mc tr tr cui
cng xut hin gi tr.
Remove() Xa s xut hin u tin ca mt i tng xc nh.
RemoveAt() Xa mt thnh phn v tr xc nh.
RemoveRange() Xa mt dy cc thnh phn.
Reverse() o th t cc thnh phn trong mng.
SetRange() Sao chp nhng thnh phn ca tp hp qua dy nhng
thnh phn trong ArrayList.
Sort() Sp xp ArrayList.
ToArray() Sao chp nhng thnh phn ca ArrayList n mt mng
mi.
TrimToSize() 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
// mt lp n gin lu tr trong mng
public class Employee
{
public Employee(int empID)
{
this.empID = empID;
}
public override string ToString()
{
return empID.ToString();
}
public int EmpID
{
get
{
Mng,ChMc,vTpHp
250
NgnNgLpTrnhC#
return empID;
}
set
{
empID = value;
}
}
private int empID;
}
public class Tester
{
static void Main()
{
ArrayList empArray = new ArrayList();
ArrayList intArray = new ArrayList();
// a vo mng
for( int i = 0; i < 5; i++)
{
empArray.Add( new Employee(i+100));
intArray.Add( i*5 );
}
// in tt c ni dung
for(int i = 0; i < intArray.Count; i++)
{
Console.Write({0} ,intArray[i].ToString());
}
Console.WriteLine(\n);
// in tt c ni dung ca mng
for(int i = 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);
}
}
}
Mng,ChMc,vTpHp
251
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
Kt qu:
0 5 10 15 20
100 101 102 103 104
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 ArrayList c th lu tr:
public int Capacity {virtual get; virtual set;}
Mc nh gi tr ca Capacity l 16, nu khi thm thnh phn th 17 vo th Capacity t ng
nhn i ln l 32. Nu chng ta thay i vng lp nh sau:
for( int i = 0; i < 17; i++)
th kt qu ging nh sau:
0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
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:
public class Employee: IComparable
thc thi giao din IComparable, i tng Employee phi cung cp mt phng thc
CompareTo():
public int CompareTo(Object o)
{
Employee r = (Employee) o;
return this.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
Mng,ChMc,vTpHp
252
NgnNgLpTrnhC#
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:
Random r = new Random();
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
// mt lp n gin lu tr trong mng
public class Employee : IComparable
{
public Employee(int empID)
{
this.empID = empID;
}
public override string ToString()
{
return empID.ToString();
}
public int EmpID
{
get
{
return empID;
}
set
Mng,ChMc,vTpHp
253
NgnNgLpTrnhC#
{
empID = value;
}
}
// So snh c delegate cho Employee
// Employee s dng phng thc so snh
// mc nh ca s nguyn
public int CompareTo(Object o)
{
Employee r = (Employee) o;
return this.empID.CompareTo(r.empID);
}
private int empID;
}
public class Tester
{
static void Main()
{
ArrayList empArray = new ArrayList();
ArrayList intArray = new ArrayList();
Random r = new Random();
// a vo mng
for( int i = 0; i < 5; i++)
{
empArray.Add( new Employee(r.Next(10)+100));
intArray.Add( r.Next(10) );
}
// in tt c ni dung
for(int i = 0; i < intArray.Count; i++)
{
Console.Write({0} ,intArray[i].ToString());
}
Console.WriteLine(\n);
// in tt c ni dung ca mng
for(int i = 0; i < empArray.Count; i++)
{
Console.Write({0} ,empArray[i].ToString());
}
Mng,ChMc,vTpHp
254
NgnNgLpTrnhC#
Console.WriteLine(\n);
// sp xp v hin th mng nguyn
intArray.Sort();
for(int i = 0; i < intArray.Count; i++)
{
Console.Write({0} , intArray[i].ToString());
}
Console.WriteLine(\n);
// sp xp li mng Employee
empArray.Sort();
// hin th tt c ni dung ca mng Employee
for(int i = 0; i < empArray.Count; i++)
{
Console.Write({0} , empArray[i].ToString());
}
Console.WriteLine(\n);
}
}
}
-----------------------------------------------------------------------------
Kt qu:
8 5 7 3 3
105 103 107 104 102
3 3 5 7 8
102 103 104 105 107
-----------------------------------------------------------------------------
Kt qu ch ra rng mng s nguyn v mng Employee c 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 IComparable
phng 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 Employee c th
c sp xp theo hai loi l empID hoc l yearsOfSvc.
Mng,ChMc,vTpHp
255
NgnNgLpTrnhC#
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 EmployeeComparer bit
v nhng i tng Employee v cng bit cch sp xp chng. EmployeeComparer c mt
thuc tnh, WhichComparision c kiu l Employee.EmployeeComparer.ComparisionType:
public Employee.EmployeeComparer.ComparisionType WhichComparision
{
get
{
return whichComparision;
}
set
{
wichComparision = value;
}
}
ComparisionType l kiu lit k vi hai gi tr, empID hay yearsOfSvc, hai gi tr ny ch ra
rng chng ta mun sp xp theo ID hay s nm phc v:
public enum ComparisionType
{
EmpID,
Yrs
};
Trc khi gi Sort(), chng ta s to th hin ca EmployeeComparer v thit lp gi tr cho
thuc tnh kiu ComparisionType:
Employee.EmployeeComparer c = Employee.GetComparer();
c.WhichComparision = Employee.EmployeeComparer.ComparisionType.EmpID;
empArray.Sort(c);
Khi chng ta gi Sort() th ArrayList s 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 WhichComparision ca n:
Compare(object lhs, object rhs)
{
Employee l = (Employee) lhs;
Employee r = (Employee) rhs;
return l.CompareTo(r.WhichComparision);
}
i tng Employee phi thc thi mt phin bn ring ca CompareTo() thc hin vic so
snh:
Mng,ChMc,vTpHp
256
NgnNgLpTrnhC#
public int CompareTo(Employee rhs,
Employee.EmployeeComparer.ComparisionType which)
{
switch (which)
{
case Employee.EmployeeComparer.ComparisionType.EmpID:
return this.empID.CompareTo( rhs.empID);
case Employee.EmployeeComparer.ComparisionType.Yrs:
return this.yearsOfSvc.CompareTo(rhs.yearsOfSvc);
}
return 0;
}
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
//lp n gin lu tr trong mng
public class Employee : IComparable
{
public Employee(int empID)
{
this.empID = empID;
}
public Employee(int empID, int yearsOfSvc)
{
this.empID = empID;
this.yearsOfSvc = yearsOfSvc;
}
public override string ToString()
{
return ID: +empID.ToString() + . Years of Svc:
+ yearsOfSvc.ToString();
}
Mng,ChMc,vTpHp
257
NgnNgLpTrnhC#
// phng thc tnh nhn i tng Comparer
public static EmployeeComparer GetComparer()
{
return new Employee.EmployeeComparer();
}
public int CompareTo(Object rhs)
{
Employee r = (Employee) rhs;
return this.empID.CompareTo(r.empID);
}
// thc thi c bit c gi bi custom comparer
public int CompareTo(Employee rhs,
Employee.EmployeeComparer.ComparisionType which)
{
switch (which)
{
case Employee.EmployeeComparer.ComparisionType.EmpID:
return this.empID.CompareTo( rhs.empID);
case Employee.EmployeeComparer.ComparisionType.Yrs:
return this.yearsOfSvc.CompareTo( rhs.yearsOfSvc);
}
return 0;
}
// lp bn trong thc thi IComparer
public class EmployeeComparer : IComparer
{
// nh ngha kiu lit k
public enum ComparisionType
{
EmpID,
Yrs
};
// yu cu nhng i tng Employee t so snh vi nhau
public int Compare( object lhs, object rhs)
{
Employee l = (Employee) lhs;
Employee r = (Employee) rhs;
return l.CompareTo(r, WhichComparision);
Mng,ChMc,vTpHp
258
NgnNgLpTrnhC#
}
public Employee.EmployeeComparer.ComparisionType WhichComparision
{
get
{
return whichComparision;
}
set
{
whichComparision = value;
}
}
private Employee.EmployeeComparer.ComparisionType whichComparision;
}
private int empID;
private int yearsOfSvc = 1;
}
public class Teser
{
static void Main()
{
ArrayList empArray = new ArrayList();
Random r = new Random();
// a vo mng
for(int i=0; i < 5; i++)
{
empArray.Add( new Employee(r.Next(10)+100, r.Next(20)));
}
// hin th tt c ni dung ca mng Employee
for(int i=0; i < empArray.Count; i++)
{
Console.Write(\n{0} , empArray[i].ToString());
}
Console.WriteLine(\n);
// sp xp v hin th mng
Employee.EmployeeComparer c = Employee.GetComparer();
c.WhichComparision =
Employee.EmployeeComparer.ComparisionType.EmpID;
Mng,ChMc,vTpHp
259
NgnNgLpTrnhC#
empArray.Sort(c);
// hin th ni dung ca mng
for(int i=0; i < empArray.Count; i++)
{
Console.Write(\n{0} , empArray[i].ToString());
}
Console.WriteLine(\n);
c.WhichComparision = Employee.EmployeeComparer.ComparisionType.Yrs;
empArray.Sort(c);
// hin th ni dung ca mng
for(int i=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
-----------------------------------------------------------------------------
Mng,ChMc,vTpHp
260
NgnNgLpTrnhC#
Khi u tin hin th kt qu th t va nhp vo. Trong gi tr ca empID, v
yearsOfSvc c 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 Mc ch
Synchronized() Phng thc static tr v mt Queue wrapper c
thread-safe.
Count Thuc tnh tr v s thnh phn trong hng i
IsReadOnly Thuc tnh xc nh hng i l ch c
IsSynchronized Thuc tnh xc nh hng i c ng b
SyncRoot Thuc tnh tr v i tng c th c s dng
ng b truy cp Queue.
Clear() Xa tt c cc thnh phn trong hng i
Clone() To ra mt bn sao
Contains() Xc nh xem mt thnh phn c trong mng.
CopyTo() Sao chp nhng thnh phn ca hng i n mng
mt chiu tn ti
Dequeue() Xa v tr v thnh phn bt u ca hng i.
Enqueue() Thm mt thnh phn vo hng i.
GetEnumerator() Tr v mt enumerator cho hng i.
Peek() Tr v phn t u tin ca hng i v khng xa n.
ToArray() Sao chp nhng thnh phn qua mt mng mi
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 Enqueue v sau
ly chng ra khi hng i vi Dequeue hay bng s dng enumerator. V d 9.15 minh
ha vic s dng hng i.
V d 9.15: Lm vic vi hng i.
-----------------------------------------------------------------------------
Mng,ChMc,vTpHp
261
NgnNgLpTrnhC#
namespace Programming_CSharp
{
using System;
using System.Collections;
public class Tester
{
public static void Main()
{
Queue intQueue = new Queue();
// a vo trong mng
for(int i=0; i <5; i++)
{
intQueue.Enqueue(i*5);
}
// hin th hng i
Console.Write(intQueue values:\t);
PrintValues( intQueue);
// xa thnh phn ra khi hng i
Console.WriteLine(\nDequeue\t{0}, intQueue.Dequeue());
// hin th hng i
Console.Write(intQueue values:\t);
PrintValues(intQueue);
// xa thnh phn khi hng i
Console.WriteLine(\nDequeue\t{0}, intQueue.Dequeue());
// hin th hng i
Console.Write(intQueue values:\t);
PrintValues(intQueue);
// Xem thnh phn u tin trong hng i.
Console.WriteLine(\nPeek \t{0}, intQueue.Peek());
// hin th hng i
Console.Write(intQueue values:\t);
PrintValues(intQueue);
}
public static void PrintValues(IEnumerable myCollection)
{
IEnumerator myEnumerator = myCollection.GetEnumerator();
while (myEnumerator.MoveNext())
Console.Write({0} , myEnumerator.Current);
Mng,ChMc,vTpHp
262
NgnNgLpTrnhC#
Console.WriteLine();
}
}
}
-----------------------------------------------------------------------------
Kt qu:
intQueue values: 0 5 10 15 20
Dequeue 0
intQueue values: 5 10 15 20
Dequeue 5
intQueue values: 10 15 20
Peek 10
intQueue values: 10 15 20
-----------------------------------------------------------------------------
Trong v d ny ArrayList c thay bng Queue, chng ta cng c th Enqueue nhng 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 Enumerator
c 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 static tr v mt Stack wrapper
c thread-safe.
Mng,ChMc,vTpHp
263
NgnNgLpTrnhC#
Count Thuc tnh tr v s thnh phn trong ngn xp
IsReadOnly Thuc tnh xc nh ngn xp l ch c
IsSynchronized Thuc tnh xc nh ngn xp c ng b
SyncRoot Thuc tnh tr v i tng c th c s dng
ng b truy cp Stack.
Clear() Xa tt c cc thnh phn trong ngn xp
Clone() To ra mt bn sao
Contains() Xc nh xem mt thnh phn c trong mng.
CopyTo() Sao chp nhng thnh phn ca ngn xp n
mng mt chiu tn ti
Pop() Xa v tr v phn t u Stack
Push() a mt i tng vo u ngn xp
GetEnumerator() Tr v mt enumerator cho ngn xp.
Peek() Tr v phn t u tin ca ngn xp v khng
xa n.
ToArray() Sao chp nhng thnh phn qua mt mng mi
Bng 9.5 : Phng thc v thuc tnh ca lp Stack.
Ba lp ArrayList, Queue, v Stack u 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
// lp n gin lu tr
public class Tester
{
static void Main()
{
Stack intStack = new Stack();
// a vo ngn xp
for (int i=0; i < 8; i++)
{
intStack.Push(i*5);
Mng,ChMc,vTpHp
264
NgnNgLpTrnhC#
}
// hin th stack
Console.Write(intStack values:\t);
PrintValues( intStack );
// xa phn t u tin
Console.WriteLine(\nPop\t{0}, intStack.Pop());
// hin th stack
Console.Write(intStack values:\t);
PrintValues( intStack );
// xa tip phn t khc
Console.WriteLine(\nPop\t{0}, intStack.Pop());
// hin th stack
Console.Write(intStack values:\t);
PrintValues( intStack );
// xem thnh phn u tin stack
Console.WriteLine(\nPeek \t{0}, intStack.Peek());
// hin th stack
Console.Write(intStack values:\t);
PrintValues( intStack );
// khai bo mng vi 12 phn t
Array targetArray = Array.CreateInstance(typeof(int), 12);
for(int i=0; i <=8; i++)
{
targetArray.SetValue(100*i, i);
}
// hin th gi tr ca mng
Console.WriteLine(\nTarget array: );
PrintValues( targetArray );
// chp ton b stack vo mng ti v tr 6
intStack.CopyTo( targetArray, 6);
// hin th gi tr ca mng sau copy
Console.WriteLine(\nTarget array after copy: );
PrintValues( targetArray );
// chp ton b stack vo mng mi
Object[] myArray = intStack.ToArray();
// hin th gi tr ca mng mi
Console.WriteLine(\nThe new array: );
PrintValues( myArray );
Mng,ChMc,vTpHp
265
NgnNgLpTrnhC#
}
public static void PrintValues(IEnumerable myCollection)
{
IEnumerator myEnumerator = myCollection.GetEnumerator();
while (myEnumerator.MoveNext())
Console.Write({0} , myEnumerator.Current);
Console.WriteLine();
}
}
}
-----------------------------------------------------------------------------
Kt qu:
intStack values: 35 30 25 20 15 10 5 0
Pop 35
intStack values: 30 25 20 15 10 5 0
Pop 30
intStack values: 25 20 15 10 5 0
Peek 25
intStack values: 25 20 15 10 5 0
Target array:
0 100 200 300 400 500 600 700 800 0 0 0
Target array after copy:
0 100 200 300 400 500 25 20 15 10 5 0
The new array:
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 Array nh 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
myArray c khai bo tng ng.
Object[] myArray = myIntStack.ToArray();
Kiu t in
Mng,ChMc,vTpHp
266
NgnNgLpTrnhC#
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 = new string[50];
Mng stateCapital s 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:
string capitalOfArkansas = 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 Mc ch
Synchronized() Phng thc static tr v mt Hashtable wrapper
c thread-safe.
Count Thuc tnh tr v s thnh phn trong hashtable
IsReadOnly Thuc tnh xc nh hashtable l ch c
IsSynchronized Thuc tnh xc nh hashtable c ng b
SyncRoot Thuc tnh tr v i tng c th c s dng
ng b truy cp Hastable.
Mng,ChMc,vTpHp
267
NgnNgLpTrnhC#
Keys Thuc tnh tr v mt ICollection cha nhng kha
trong hashtable.
Values Thuc tnh tr v mt ICollection cha nhng gi
tr trong hashtable.
Add() Thm mt thnh phn mi vi kha v gi tr xc
nh.
Clear() Xa tt c i tng trong hashtable.
Item() Ch mc cho hastable
Clone() To ra mt bn sao
Contains() Xc nh xem mt thnh phn c trong hashtable.
ContainsKey() Xc nh xem hashtable c cha mt kha xc
nh
CopyTo() Sao chp nhng thnh phn ca hashtable n
mng mt chiu tn ti
GetEnumerator() Tr v mt enumerator cho hashtable.
GetObjectData() Thc thi ISerializable v tr v d liu cn thit
lu tr.
OnDeserialization Thc thi ISerializable v pht sinh s kin
deserialization khi hon thnh.
Remove() 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 Hashtable th 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
Mng,ChMc,vTpHp
268
NgnNgLpTrnhC#
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 Item c khai bo nh sau:
object this[object key]
{ get; set;}
Thuc tnh Item c 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Collections;
public class Tester
{
static void Main()
{
// to v khi to hashtable
Hashtable hashTable = new Hashtable();
hashTable.Add(00440123,Ngoc Thao);
hashTable.Add(00123001,My Tien);
hashTable.Add(00330124,Thanh Tung);
// truy cp qua thuc tnh Item
Console.WriteLine(myHashtable[\00440123\]: {0},
hashTable[00440123]);
Mng,ChMc,vTpHp
269
NgnNgLpTrnhC#
}
}
}
-----------------------------------------------------------------------------
Kt qu:
hashTable[00440123]: Ngoc Thao
-----------------------------------------------------------------------------
V d 9.17 bt u bng vic to mt bng Hashtable mi, 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
Keys truy cp i tng ICollection vi tt c nhng kha trong Hashtable, v Values truy
cp i tng ICollection vi tt c gi tr. V d 9.18 minh ha nh sau.
V d 9.18 Tp kha v tp gi tr.
-----------------------------------------------------------------------------
namespace Progrmming_CSharp
{
using System;
using System.Collections;
public class Tester
{
static void Main()
{
// to v khi to hashtable
Hashtable hashTable = new Hashtable();
hashTable.Add(00440123,Ngoc Thao);
hashTable.Add(00123001,My Tien);
hashTable.Add(00330124,Thanh Tung);
// nhn tp kha
ICollection keys = hashTable.Keys;
// nhp tp gi tr
ICollection values = hashTable.Values;
// xut tp kha
foreach( string s in keys)
{
Mng,ChMc,vTpHp
270
NgnNgLpTrnhC#
Console.WriteLine({0}, s);
}
// xut tp gi tr
foreach( string s in values)
{
Console.WriteLine({0}, s);
}
}
}
}
-----------------------------------------------------------------------------
Kt qu:
00123001
00440123
00330124
My Tien
Ngoc Thao
Thanh Tung
-----------------------------------------------------------------------------
Mc d th t ca keys khng 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 My Tien,...
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.
-----------------------------------------------------------------------------
namespace Progrmming_CSharp
{
using System;
using System.Collections;
public class Tester
{
static void Main()
{
Mng,ChMc,vTpHp
271
NgnNgLpTrnhC#
// to v khi to hashtable
Hashtable hashTable = new Hashtable();
hashTable.Add(00440123,Ngoc Thao);
hashTable.Add(00123001,My Tien);
hashTable.Add(00330124,Thanh Tung);
Console.WriteLine(hashTable);
Console.WriteLine(Count: {0},hashTable.Count);
Console.WriteLine(Keys and Values:);
Print( hashTable );
}
public static void Print(Hashtable table)
{
IDictionaryEnumerator enumerator = table.GetEnumerator();
while ( enumerator.MoveNext() )
{
Console.WriteLine(\t{0}:\t{1},
enumerator.Key, enumerator.Value);
}
Console.WriteLine();
}
}
}
-----------------------------------------------------------------------------
Kt qu:
hashTableg
Count: 3
Keys and Values:
00123001: My Tien
00440123: Ngoc Thao
00330124: Thanh Tung
-----------------------------------------------------------------------------
Cu hi v tr li
Cu hi 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.
Cu hi 2: Mt lp c b ch mc khc mt mng nh th no?
Mng,ChMc,vTpHp
272
NgnNgLpTrnhC#
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
Cu hi 1: T kho params c s dng lm g?
Cu hi 2: ngha ca lnh lp foreach? Lnh ny c s dng vi kiu d liu no?
Cu hi 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.
Cu hi 4: Cch to ra mng a chiu khng cng kch thc?
Cu hi 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?
Cu hi 7: Kiu d liu no c th lm ch mc trong b ch mc ca mt lp?
Cu hi 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?
Cu hi 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?
Mng,ChMc,vTpHp
273
NgnNgLpTrnhC#
Cu hi 16: Cch ly tp gi tr trong mt i tng Hashtable?
Cu hi 17: Cch ly tp kha trong mt i tng Hastable?
Cu hi 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?
Cu hi 20: Hashtable thc thi cc giao din tp hp no?
Cu hi 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 tp 5: 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.
Mng,ChMc,vTpHp
274
NgnNgLpTrnhC#
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 tp 9: 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.
Mng,ChMc,vTpHp
275
NgnNgLpTrnhC#
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 biu
XLChui
276
NgnNgLpTrnhC#
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, y
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.String nh sau:
public sealed class String : 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.String
chuyn i vi nhng lp khc trong h thng .NET.
Nh chng ta xem trong chng 9, giao din IComparable c 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
IComparable thc 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 ICloneable thc thi phng thc Clone().
Nhng lp IConvertible cung 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:
string newString = Day la chuoi hang;
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
XLChui
277
NgnNgLpTrnhC#
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:
string literal1 = \\\\MyDocs\\CSharp\\ProgrammingC#.cs;
string verbatim1 = @\\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:
string literal2 = Dong mot \n dong hai;
string verbatim2 = @Dong mot
dong hai;
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:
int myInt = 9;
string intString = myInt.ToString();
Phng thc myInt.ToString() tr v mt i tng String v i tng ny c gn cho
intString.
Lp String ca .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 String l vic to mt th hin khng an ton (unsafe).
XLChui
278
NgnNgLpTrnhC#
Thao tc trn chui
Lp string cung 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 ngha
Empty Trng public static th hin mt chui rng.
Compare() Phng thc public static so snh hai chui.
CompareOrdinal() Phng thc public static so snh hai chui khng
quan tm n th t.
Concat() Phng thc public static to chui mi t mt hay
nhiu chui.
Copy() Phng thc public static to ra mt chui mi bng
sao t chui khc.
Equal() Phng thc public static kim tra xem hai chui c
cng gi tr hay khng.
Format() Phng thc public static nh dng mt chui dng
k t lnh nh dng xc nh.
Intern() Phng thc public static tr v tham chiu n th
hin ca chui.
IsInterned() Phng thc public static tr v tham chiu ca chui
Join() Phng thc public static kt ni cc chui xc nh
gia mi thnh phn ca mng chui.
Chars() Indexer ca chui.
Length() Chiu di ca chui.
Clone() Tr v chui.
CompareTo() So snh hai chui.
CopyTo() Sao chp mt s cc k t xc nh n mt mng k
t Unicode.
EndsWidth() Ch ra v tr ca chui xc nh ph hp vi chui a
ra.
Insert() Tr v chui mi c chn mt chui xc nh.
LastIndexOf() Ch ra v tr xut hin cui cng ca mt chui xc
nh trong chui.
PadLeft() Canh l phi nhng k t trong chui, chn vo bn
tri khong trng hay cc k t xc nh.
PadRight() Canh l tri nhng k t trong chui, chn vo bn
phi khong trng hay cc k t xc nh.
XLChui
279
NgnNgLpTrnhC#
Remove() Xa i mt s k t xc nh.
Split() Tr v chui c phn nh bi nhng k t xc nh
trong chui.
StartWidth() Xem chui c bt u bng mt s k t xc nh hay
khng.
SubString() Ly mt chui con.
ToCharArray() Sao chp nhng k t t mt chui n mng k t.
ToLower() Tr v bn sao ca chui kiu ch thng.
ToUpper() Tr v bn sao ca chui kiu ch hoa.
Trim() Xa b tt c s xut hin ca tp hp k t xc nh
t v tr u tin n v tr cui cng trong chui.
TrimEnd() Xa nh nhng v tr cui.
TrimStart() Xa nh Trim nhng 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class StringTester
{
static void Main()
{
// khi to mt s chui thao tc
string s1 = abcd;
string s2 = ABCD;
string s3 = @Trung Tam Dao Tao CNTT
Thanh pho Ho Chi Minh Viet Nam;
int result;
// So snh hai chui vi nhau c phn bit ch thng v ch hoa
result = string.Compare( s1 ,s2);
Console.WriteLine(So sanh hai chuoi S1: {0} v S2: {1} ket qua: {2} \n,
s1 ,s2 ,result);
// S dng tip phng thc Compare() nhng trng hp ny khng bit
// ch thng hay ch hoa
XLChui
280
NgnNgLpTrnhC#
// Tham s th ba l true s b qua kim tra k t thng hoa
result = string. Compare(s1, s2, true);
Console.WriteLine(Khong phan biet chu thuong va hoa\n);
Console.WriteLine(S1: {0} , S2: {1}, ket qua : {2}\n, s1, s2, result);
// phng thc ni cc chui
string s4 = string.Concat(s1, s2);
Console.WriteLine(Chuoi S4 noi tu chuoi S1 va S2: {0}, s4);
// s dng np chng ton t +
string s5 = s1 + s2;
Console.WriteLine(Chuoi S5 duoc noi tu chuoi S1 va S2: {0}, s5);
// S dng phng thc copy chui
string s6 = string.Copy(s5);
Console.WriteLine(S6 duoc sao chep tu S5: {0}, s6);
// S dng np chng ton t =
string s7 = s6;
Console.WriteLine(S7 = S6: {0}, s7);
// S dng ba cch so snh hai chui
// Cch 1 s dng mt chui so snh vi chui cn li
Console.WriteLine(S6.Equals(S7) ?: {0}, s6.Equals(s7));
// Cch 2 dng hm ca lp string so snh hai chui
Console.WriteLine(Equals(S6, s7) ?: {0}, string.Equals(s6, s7));
// Cch 3 dng ton t so snh
Console.WriteLine(S6 == S7 ?: {0}, s6 == s7);
// S dng hai thuc tnh hay dng l ch mc v chiu di ca chui
Console.WriteLine(\nChuoi S7 co chieu dai la : {0}, s7.Length);
Console.WriteLine(Ky tu thu 3 cua chuoi S7 la : {0}, s7[2] );
// Kim tra xem mt chui c kt thc vi mt nhm k
// t xc nh hay khng
Console.WriteLine(S3: {0}\n ket thuc voi chu CNTT ? : {1}\n,
s3, s3.EndsWith(CNTT));
Console.WriteLine(S3: {0}\n ket thuc voi chu Nam ? : {1}\n,
s3, s3.EndsWith(Nam));
// Tr v ch mc ca mt chui con
Console.WriteLine(\nTim vi tri xuat hien dau tien cua chu CNTT );
Console.WriteLine(trong chuoi S3 l {0}\n, s3.IndexOf(CNTT));
// Chn t nhn lc vo trc CNTT trong chui S3
string s8 = s3.Insert(18, nhan luc );
Console.WriteLine( S8 : {0}\n, s8);
XLChui
281
NgnNgLpTrnhC#
// Ngoi ra ta c th kt hp nh sau
string s9 = s3.Insert( s3.IndexOf( CNTT ) , nhan luc );
Console.WriteLine( S9 : {0}\n, s9);
} // end Main
} // end class
} // end namespace
-----------------------------------------------------------------------------
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:
string s1 = abcd;
string s2 = ABCD;
XLChui
282
NgnNgLpTrnhC#
string s3 = @Trung Tam Dao Tao CNTT
Thanh pho Ho Chi Minh Viet Nam;
Hai chui u s1 v s2 c 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:
// So snh hai chui vi nhau c phn bit ch thng v ch hoa
result = string.Compare( s1 ,s2);
Console.WriteLine(So sanh hai chuoi s1: {0} v s2: {1} ket qua: {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:
So sanh hai chuoi S1: abcd v S2: ABCD ket qua: -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:
// Tham s th ba l true s b qua kim tra k t thng hoa
result = string. Compare(s1, s2, true);
Console.WriteLine(Khong phan biet chu thuong va hoa\n);
Console.WriteLine(S1: {0} , S2: {1}, ket qua : {2}\n, s1, s2, result);
Lc ny th vic so snh hon ton ging nhau v kt qu tr v l gi tr 0:
Khong phan biet chu thuong va hoa
S1: abcd , S2: ABCD, ket qua : 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
public static ca string:
string s4 = string.Concat(s1, s2);
Hay cch khc n gin hn l vic s dng ton t ni hai chui (+):
string s5 = s1 + s2;
Trong c hai trng hp th kt qu ni hai chui hon ton thnh cng v nh sau:
XLChui
283
NgnNgLpTrnhC#
Chuoi S4 noi tu chuoi S1 va S2: abcdABCD
Chuoi S5 duoc noi tu chuoi S1 + 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 static Copy() nh sau:
string s6 = 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:
string s7 = s6;
Kt qu ca hai cch to trn u hon ton nh nhau:
S6 duoc sao chep tu S5: abcdABCD
S7 = 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 S7 hay 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(\nChuoi S7 co chieu dai la : {0}, s7.Length);
Console.WriteLine(Ky tu thu 3 cua chuoi S7 la : {0}, s7[2] );
Kt qu l:
Chuoi S7 co chieu dai la : 8
Ky tu thu 3 cua chuoi S7 la : 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:
// Kim tra xem mt chui c kt thc vi mt nhm k t xc nh hay khng
XLChui
284
NgnNgLpTrnhC#
Console.WriteLine(S3: {0}\n ket thuc voi chu CNTT ? : {1}\n,
s3, s3.EndsWith(CNTT));
Console.WriteLine(S3: {0}\n ket thuc voi chu Nam ? : {1}\n,
s3, s3.EndsWith(Nam));
Kt qu tr v l ln kim tra u tin l sai do chui S3 khng kt thc ch CNTT, v ln
kim tra th hai l ng:
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
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(\nTim vi tri xuat hien dau tien cua chu CNTT );
Console.WriteLine(trong chuoi S3 l {0}\n, s3.IndexOf(CNTT));
V kt qu tm c l 18:
Tim vi tri xuat hien dau tien cua chu CNTT
trong chuoi S3 l 18
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:
string s8 = s3.Insert(18, nhan luc );
Console.WriteLine( S8 : {0}\n, s8);
Kt qu a ra l:
S8 : Trung Tam Dao Tao nhan luc CNTT
Thanh pho Ho Chi Minh Viet Nam
Cui cng, chng ta c th kt hp mt s cc php ton thc hin vic chn nh sau:
string s9 = s3.Insert( s3.IndexOf( CNTT ) , nhan luc );
Console.WriteLine( S9 : {0}\n, s9);
Kt qu cui cng cng tng t nh cch chn bn trn:
S9 : Trung Tam Dao Tao nhan luc CNTT
Thanh pho Ho Chi Minh Viet Nam
Tm mt chui con
XLChui
285
NgnNgLpTrnhC#
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().
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text;
public class StringTester
{
static void Main()
{
// Khai bo cc chui s dng
string s1 = Mot hai ba bon;
int ix;
// ly ch s ca khong trng cui cng
ix = s1.LastIndexOf( );
// ly t cui cng
string s2 = s1.Substring( ix+1);
// thit lp li chui s1 t v tr 0 n v tr ix
// do s1 c gi tr mi l mot hai ba
s1 = s1.Substring(0, ix);
// tm ch s ca khong trng cui cng (sau hai)
ix = s1.LastIndexOf( );
// thit lp s3 l chui con bt u t v tr ix
// do s3 = ba
string s3 = s1.Substring(ix+1);
// thit lp li s1 bt u t v tr 0 n cui v tr ix
// s1 = mot hai
s1 = s1.Substring(0, ix);
// ix ch n khong trng gia mot va hai
ix = s1.LastIndexOf( );
// to ra s4 l chui con bt u t sau v tr ix, do
// vy c gi tr l hai
string s4 = s1.Substring( ix+1);
// thit lp li gi tr ca s1
XLChui
286
NgnNgLpTrnhC#
s1 = s1.Substring(0, ix);
// ly ch s ca khong trng cui cng, lc ny ix l 1
ix = s1.LastIndexOf( );
// to ra chui s5 bt u t ch s khong trng, nhng khng c khong
// trng v ix l 1 nn chui bt u t 0
string s5 = s1.Substring(ix +1);
Console.WriteLine(s2 : {0}\n s3 : {1}, s2, s3);
Console.WriteLine(s4 : {0}\n s5 : {1}\n, s4, s5);
Console.WriteLine(s1: {0}\n, s1);
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
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().
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text;
public class StringTester
{
static void Main()
XLChui
287
NgnNgLpTrnhC#
{
// to cc chui lm vic
string s1 = Mot, hai, ba Trung Tam Dao Tao CNTT;
// to ra hng k t khong trng v du phy
const char Space = ;
const char Comma = ,;
// to ra mng phn cch
char[] delimiters = new char[]
{
Space,
Comma
};
string output = ;
int ctr = 1;
// thc hin vic chia mt chui dng vng lp
// a kt qu vo mng cc chui
foreach ( string subString in s1.Split(delimiters) )
{
output += ctr++;
output += : ;
output += subString;
output += \n;
}// end foreach
Console.WriteLine( output );
}// end Main
}// end class
} // end namespace
-----------------------------------------------------------------------------
Kt qu:
1: Mot
2:
3: hai
4:
5: ba
6: Trung
7: Tam
8: Dao
9: Tao
XLChui
288
NgnNgLpTrnhC#
10: CNTT
-----------------------------------------------------------------------------
on chng trnh bt u bng vic to mt chui minh ha vic phn tch:
string s1 = Mot, hai, ba Trung Tam Dao Tao CNTT;
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 ( string subString in s1.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
StringBuilder c tm tt trong bng 10.2 nh sau:
System.StringBuilder
Phng thc ngha
Capacity() Truy cp hay gn mt s k t m StringBuilder nm gi.
Chars() Ch mc.
Length() Thit lp hay truy cp chiu di ca chui
MaxCapacity() Truy cp dung lng ln nht ca StringBuilder
Append() Ni mt kiu i tng vo cui ca StringBuilder
AppendFormat() Thay th nh dng xc nh bng gi tr c nh dng
ca mt i tng.
EnsureCapacity() m bo rng StringBuilder hin thi c kh nng ti thiu
ln nh mt gi tr xc nh.
Insert() Chn mt i tng vo mt v tr xc nh
Replace() Thay th tt c th hin ca mt k t xc nh vi nhng
k t mi.
Bng 10.2 Phng thc ca lp StringBuilder
XLChui
289
NgnNgLpTrnhC#
Khng ging nh String, StringBuilder th 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 String bng mt i tng StringBuilder.
V d minh ha 10.4 : S dng chui StringBuilder.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text;
public class StringTester
{
static void Main()
{
// khi to chui s dng
string s1 = Mot, hai, ba Trung Tam Dao Tao CNTT;
// to ra hng k t khong trng v du phy
const char Space = ;
const char Comma = ,;
// to ra mng phn cch
char[] delimiters = new char[]
{
Space,
Comma
};
// s dng StringBuilder to chui output
StringBuilder output = new StringBuilder();
int ctr = 1;
// chia chui v dng vng lp a kt qu vo
// mng cc chui
foreach ( string subString in s1.Split(delimiters) )
{
// AppendFormat ni mt chui c nh dng
output.AppendFormat({0}: {1}\n, ctr++, subString);
}// end foreach
Console.WriteLine( output );
}
}
}
XLChui
290
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
Chng ta ch thay phn cui ca on chng trnh 10.3. R rng vic s dng StringBuilder
thun 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, Trung Tam Dao Tao CNTT
chng ta c th tr v bt c hay tt c danh sch cc chui con (Mot, hai,...) v c th to ra
cc phin bn chui c b sung ca nhng chui con (nh : TrUng TAM,...).
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):
XLChui
291
NgnNgLpTrnhC#
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 regexp ca 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 Regex v
s dng mt s phng thc tnh trong v d minh ha 10.5.
V d minh ha 10.5: S dng lp Regex.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text;
using System.Text.RegularExpressions;
public class Tester
{
static void Main()
{
// khi to chui s dng
string s1 = Mot, hai, ba, Trung Tam Dao Tao CNTT;
XLChui
292
NgnNgLpTrnhC#
// to chui biu thc quy tc
Regex theRegex = new Regex( |, );
StringBuilder sBuilder = new StringBuilder();
int id = 1;
// s dng vng lp ly cc chui con
foreach ( string subString in theRegex.Split(s1))
{
// ni chui va tm c trong biu thc quy tc
// vo chui StringBuilder theo nh dng sn.
sBuilder.AppendFormat({0}: {1} \n, id++, subString);
}
Console.WriteLine({0}, sBuilder);
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
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.
string s1 = Mot, hai, ba, Trung Tam Dao Tao CNTT;
Tp theo mt biu thc quy tc c to ra, biu thc ny c dng tm kim mt chui:
Regex theRegex = new Regex( |, );
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 Regex mi l i tng biu thc quy
tc!
XLChui
293
NgnNgLpTrnhC#
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().
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text;
using System.Text.RegularExpressions;
public class Tester
{
static void Main()
{
// to chui tm kim
string s1 = Mot, hai, ba Trung Tam Dao Tao CNTT;
StringBuilder sBuilder = new StringBuilder();
int id = 1;
// y khng to th hin ca Regex do s dng phng
// thc tnh ca lp Regex.
foreach( string subStr in Regex.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,
XLChui
294
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text.RegularExpressions;
class Tester
{
static void Main()
{
string string1 = Ngon ngu lap trinh C Sharp;
// tm bt c chui con no khng c khong trng
// bn trong v kt thc l khong trng
Regex theReg = new Regex(@(\S+)\s);
// to tp hp v nhn kt qu so khp
MatchCollection theMatches = theReg.Matches(string1);
// lp ly kt qu t tp hp
foreach ( Match theMatch in theMatches)
{
Console.WriteLine(Chieu dai: {0}, theMatch.Length);
// nu tn ti chui th xut ra
if ( theMatch.Length != 0)
{
Console.WriteLine(Chuoi: {0}, theMatch.ToString());
}// end if
}// end foreach
}// end Main
}// end class
}// end namespace
XLChui
295
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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:
string string1 = Ngon ngu lap trinh C Sharp;
v mt biu thc quy tc thc hin vic tm kim trn chui string1:
Regex theReg = new Regex(@(\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 Length l 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 IPAddresses c tm thy bt c u trong mt chui.
Lp Group cho 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
XLChui
296
NgnNgLpTrnhC#
Lp Match dn xut t nhm Group, v c mt tp hp gi l Groups cha tt c cc nhm
m Match tm thy.
Vic to v s dng tp hp Groups v lp Group c minh ha trong v d 10.8 nh sau:
V d minh ha 10.8: S dng lp Group.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text.RegularExpressions;
class Tester
{
public static void Main()
{
string string1 = 10:20:30 127.0.0.0 Dolphin.net;
// nhm thi gian bng mt hay nhiu con s hay du :
// v theo sau bi khong trng.
Regex theReg = new Regex(@(?<time>(\d|\:)+)\s +
// a ch IP l mt hay nhiu con s hay du chm theo
// sau bi khong trng
@(?<ip>(\d|\.)+)\s +
// a ch web l mt hay nhiu k t
@(?<site>\S+));
// ly mt tp hp cc chui c so khp
MatchCollection theMatches = theReg.Matches( string1 );
// s dng vng lp ly cc chui trong tp hp
foreach (Match theMatch in theMatches)
{
if (theMatch.Length != 0)
{
Console.WriteLine(\ntheMatch: {0}, theMatch.ToString());
// hin th thi gian
Console.WriteLine(Time: {0}, theMatch.Groups[time]);
// hin th a ch IP
Console.WriteLine(IP: {0}, theMatch.Groups[ip]);
// hin th a ch web site
Console.WriteLine(Site: {0}, theMatch.Groups[site]);
}// end if
}// end foreach
XLChui
297
NgnNgLpTrnhC#
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
V d minh ha 10.8 bt u bng vic to mt chui n gin tm kim nh sau:
string string1 = 10:20:30 127.0.0.0 Dolphin.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:
MatchCollection theMatches = theReg.Matches( string1 );
Vng lp foreach c dng ly ra cc chui con c tm thy trong tp hp.
Nu chiu di Length ca 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:30 127.0.0.0 Dolphin.net
Sau chng trnh ly nhm time t tp hp nhm ca Match v 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 ip v site:
XLChui
298
NgnNgLpTrnhC#
Console.WriteLine(IP: {0}, theMatch.Groups[ip]);
// hin th a ch web site
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 Match ch 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:
String string1 = 10:20:30 127.0.0.0 Dolphin.net +
10:20:31 127.0.0.0 Mun.net +
10:20:32 127.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:30 127.0.0.0 Dolphin.net
Time: 10:20:30
IP: 127.0.0.0
site: Dolphin.net
theMatch: 10:20:31 127.0.0.0 Mun.net
Time: 10:20:31
IP: 127.0.0.0
Site: Mun.net
theMatch: 10:20:32 127.0.0.0 Msn.net
time: 10:20:32
IP: 127.0.0.0
Site: Msn.net
Trong v d ny phn b sung, th theMatches cha 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 Regex tm thy mt chui con, th mt th hin Capture c 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.
XLChui
299
NgnNgLpTrnhC#
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 Capture trong 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:
Regex theReg = new Regex(@(?<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:
string string1 = 10:20:30 IBM 127.0.0.0 HP;
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:30 IBM 127.0.0.0 HP
Time: 10:20:30
IP: 127.0.0.0
Company: HP
iu g xy ra? Ti sao nhm Company ch 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, Group vn 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text.RegularExpressions;
class Test
XLChui
300
NgnNgLpTrnhC#
{
public static void Main()
{
// to mt chui phn tch
// lu l tn cng ty c xut
// hin c hai ni
string string1 = 10:20:30 IBM 127.0.0.0 HP;
// biu thc quy tc vi vic nhm hai ln tn cng ty
Regex theReg = new Regex(@(?<time>(\d|\:)+)\s +
@(?<company>\S+)\s +
@(?<ip>(\d|\ .)+)\s +
@(?<company>\S+)\s);
// a vo tp hp cc chui c tm thy
MatchCollection theMatches = theReg.Matches( string1 );
// dng vng lp ly kt qu
foreach ( Match theMatch in theMatches)
{
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]);
// lp qua tp hp Capture ly nhm company
foreach ( Capture cap in theMatch.Groups[Company].Captures)
{
Console.WriteLine(Capture: {0}, cap.ToString());
}// end foreach
}// end if
}// end foreach
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
Kt qu:
theMatch: 10:20:30 IBM 127.0.0.0 HP
Time: 10:20:30
IP: 127.0.0.0
XLChui
301
NgnNgLpTrnhC#
Company: HP
Capture: IBM
Capture: HP
-----------------------------------------------------------------------------
Trong on vng lp cui cng:
foreach ( Capture cap in theMatch.Groups[Company].Captures)
{
Console.WriteLine(Capture: {0}, cap.ToString());
}// end foreach
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 Group c mt tp hp tn l Captures, v dng lnh tip sau tr v mt tp hp
Captures cho Group lu 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 : IBM v 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 Captures chng ta c
th thu c c hai gi tr c lu gi.
Cu hi v tr li
Cu hi 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 StringBuilder cho php thao tc trc tip b sung chui.
Cu hi 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.
Cu hi 3: Thao tc thng xuyn thc hin trn mt chui l thao tc no?
XLChui
302
NgnNgLpTrnhC#
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
Cu hi 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?
Cu hi 3: S khc nhau c bn gia mt chui to t i tng string v StringBuilder?
Cu hi 4: Khi no th nn dng chui to t lp string v StringBuilder?
Cu hi 5: Mt biu thc quy tc c bao nhiu kiu k t?
Cu hi 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 tp 4: 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 tp 5: 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.
XLChui
303
NgnNgLpTrnhC#
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 . Ngi
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
CChyQuyn-SKin
304
NgnNgLpTrnhC#
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:
public delegate int WhichIsFirst(object obj1, object obj2);
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 object v 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.
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
CChyQuyn-SKin
305
NgnNgLpTrnhC#
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 Pair cha 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 Pair phi 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
Pair phi 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 Pair xc nh i tng no n trc u tin v i tng no l th hai.
Lp Pair nh ngha mt y quyn, WhichIsFirst. Phng thc Sort s 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 Cat v 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 Cat v 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 Student v 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:
public class Pair
{
// a vo 2 i tng theo th t
public Pair( object firstObjectr, object secondObject)
{
thePair[0] = firstObject;
CChyQuyn-SKin
306
NgnNgLpTrnhC#
thePair[1] = secondObject;
}
// bin lu gi hai i tng
private object[] thePair = new object[2];
}
Tip theo l chng ta ph quyt phng thc ToString() cha gi tr mi ca hai i
tng m Pair nm gi:
public override string ToString()
{
// xut th t i tng th nht trc i tng th hai
return thePair[0].ToString() +, + thePair[1].ToString();
}
By gi th chng ta c hai i tng bn trong ca Pair v 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 Pair thc 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 WhichIsFirst c nh ngha
bn trong lp Pair:
public delegate comparison
WhichIsFirst( object obj1, object obj2);
Gi tr tr v l kiu comparison y l kiu lit k:
public enum comparison
{
theFirstComesFirst = 1,
theSecondComesFirst = 2
}
Bt c phng thc tnh no ly hai tham s i tng object v tr v kiu comparison
c th c ng gi bi y quyn vo lc thc thi.
Lc ny chng ta nh ngha phng thc Sort cho lp Pair:
public void Sort( WhichIsFirst theDelegateFunc)
{
if (theDelegateFunc(thePair[0], thePair[1]) ==
comparison.theSecondComeFirst)
{
CChyQuyn-SKin
307
NgnNgLpTrnhC#
object temp = thePair[0];
thePair[0] = thePair[1];
thePair[1] = temp;
}
}
Phng thc ny ly mt tham s: mt y quyn c kiu WhichIsFirst vi 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 Pair s c hon i
v tr, trng hp ngc li th khng lm g c.
Hy tng tng chng ta ang sp xp nhng Student theo tn. Chng ta vit mt
phng thc tr v theFirstComesFirst nu tn ca sinh vin u tin n trc v the-
SecondComesFirst 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:
public void ReverseSort( WhichIsFirst theDeleagteFunc)
{
if ( theDelegateFunc( thePair[0], thePair[1]) ==
comparison.theFirstComesFirst)
{
object temp = 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 l Amy, Beth, phng thc y quyn s tr v theFirstComesFirst, 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.
CChyQuyn-SKin
308
NgnNgLpTrnhC#
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
Student mt tn vo lc to:
public class Student
{
public Student (string name)
{
this.name = name;
}
}
Lp i tng Student ny 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.
Lp Student phi ph quyt phng thc ToString() cho phng thc ToString() ca lp
Pair s dng mt cch chnh xc. Vic thc thi ny th khng c g phc tp m ch n thun
l tr v tn ca sinh vin:
public override string ToString()
{
return name;
}
Student cng 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:
public static comparison WhichStudentComesFirst(Object o1, Object o2)
{
Student s1 = (Student) o1;
Student s2 = (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 WhichStudentComesFirst ly 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.
CChyQuyn-SKin
309
NgnNgLpTrnhC#
Lp th hai l Cat, phc v cho mc ch ca chng ta, th Cat s c sp xp theo trng
lng, nh n trc nng. Ta c khai bo lp Cat nh sau:
public class Cat
{
public Cat( int weight)
{
this.weight = weight;
}
// sp theo trng lng
public static comparison WhichCatComesFirst(Object o1, Object o2)
{
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
return c1.weight > c2.weight ?
theSecondComesFirst :
theFirstComesFirst;
}
public override string ToString()
{
return weight.ToString();
}
// bin lu gi trng lng
private int weight;
}
Cng tng t nh lp Student th 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// khai bo kiu lit k
public enum comparison
{
theFirstComesFirst =1,
CChyQuyn-SKin
310
NgnNgLpTrnhC#
theSecondComesFirst = 2
}
// lp Pair n gin lu gi 2 i tng
public class Pair
{
// khai bo y quyn
public delegate comparison WhichIsFirst( object obj1, object obj2);
// truyn hai i tng vo b khi dng
public Pair( object firstObject, object secondObject)
{
thePair[0] = firstObject;
thePair[1] = secondObject;
}
// phng thc sp xp th t ca hai i tng
// theo bt c tiu chun no ca i tng
public void Sort( WhichIsFirst theDelegateFunc)
{
if (theDelegateFunc(thePair[0], thePair[1]) ==
comparison.theSecondComesFirst)
{
object temp = thePair[0];
thePair[0] = thePair[1];
thePair[1] = temp;
}
}
// phng thc sp xp hai i tng theo
// th t nghch o li tiu chun sp xp
public void ReverseSort( WhichIsFirst theDelegateFunc)
{
if (theDelegateFunc( thePair[0], thePair[1]) ==
comparison.theFirstComesFirst)
{
object temp = thePair[0];
thePair[0] = thePair[1];
thePair[1] = temp;
}
}
// yu cu hai i tng a ra gi tr ca n
CChyQuyn-SKin
311
NgnNgLpTrnhC#
public override string ToString()
{
return thePair[0].ToString() + , + thePair[1].ToString();
}
// mng lu 2 i tng
private object[] thePair = new object[2];
}
//lp i tng Cat
public class Cat
{
public Cat(int weight)
{
this.weight = weight;
}
// sp theo th t trng lng
public static comparison WhichCatComesFirst(Object o1, Object o2)
{
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
return c1.weight > c2.weight ?
comparison.theSecondComesFirst :
comparison.theFirstComesFirst;
}
public override string ToString()
{
return weight.ToString();
}
// bin lu trng lng
private int weight;
}
// khai bo lp Student
public class Student
{
public Student( string name)
{
this.name = name;
}
// sp theo th t ch ci
CChyQuyn-SKin
312
NgnNgLpTrnhC#
public static comparison WhichStudentComesFirst( Object o1, Object o2)
{
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return (String.Compare( s1.name, s2.name) <0 ?
comparison.theFirstComesFirst :
comparison.theSecondComesFirst);
}
public override string ToString()
{
return name;
}
// bin lu tn
private string name;
}
public class Test
{
public static void Main()
{
// to ra hai i tng Student v Cat
// a chng vo hai i tng Pair
Student Thao = new Student(Thao);
Student Ba = new Student(Ba);
Cat Mun = new Cat(5);
Cat Ngao = new Cat(2);
Pair studentPair = new Pair(Thao, Ba);
Pair catPair = new Pair(Mun, Ngao);
Console.WriteLine(Sinh vien \t\t\t: {0}, studentPair.ToString());
Console.WriteLine(Meo \t\t\t: {0}, catPair.ToString());
// to y quyn
Pair.WhichIsFirst theStudentDelegate = new
Pair.WhichIsFirst( Student.WhichStudentComesFirst);
Pair.WhichIsFirst theCatDelegate = new
Pair.WhichIsFirst( Cat.WhichCatComesFirst);
// sp xp dng y quyn
studentPair.Sort( theStudentDelegate);
Console.WriteLine(Sau khi sap xep studentPair\t\t:{0},
studentPair.ToString());
CChyQuyn-SKin
313
NgnNgLpTrnhC#
studentPair.ReverseSort(theStudentDelegate);
Console.WriteLine(Sau khi sap xep nguoc studentPair\t\t:{0},
studentPair.ToString());
catPair.Sort( theCatDelegate);
Console.WriteLine(Sau khi sap xep catPair\t\t:{0},
catPair.ToString());
catPair.ReverseSort(theCatDelegate);
Console.WriteLine(Sau khi sap xep nguoc catPair\t\t:{0},
catPair.ToString());
}
}
}
-----------------------------------------------------------------------------
Kt qu:
Sinh vien : Thao, Ba
Meo : 5, 2
Sau khi sap xep studentPair : Ba, Thao
Sau khi sap xep nguoc studentPair : Thao, Ba
Sau khi sap xep catPair : 2, 5
Sau khi sap xep nguoc catPair : 5, 2
-----------------------------------------------------------------------------
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
Student ly mt chui i din cho tn ca sinh vin v b khi dng ca lp Cat th ly mt
s int i din cho trng lng ca mo.
Student Thao = new Student(Thao);
Student Ba = new Student(Ba);
Cat Mun = new Cat(5);
Cat Ngao = new Cat(2);
Pair studentPair = new Pair(Thao, Ba);
Pair catPair = new Pair(Mun, Ngao);
Console.WriteLine(Sinh vien \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:
Sinh vien : Thao, Ba
Meo : 5, 2
CChyQuyn-SKin
314
NgnNgLpTrnhC#
Th t xut hin ca n chnh l th t a vo. Tip theo chng ta khi to hai i tng y
quyn:
Pair.WhichIsFirst theStudentDelegate = new
Pair.WhichIsFirst( Student.WhichStudentComesFirst);
Pair.WhichIsFirst theCatDelegate = 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:
Sau khi sap xep studentPair : Ba, Thao
Sau khi sap xep nguoc studentPair : Thao, Ba
Sau khi sap xep catPair : 2, 5
Sau khi sap xep nguoc catPair : 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 Main ca Test). iu ny c
th khng cn thit ta c th s dng khai bo y quyn tnh t hai lp Student v Cat. Do
vy ta c th b sung lp Student bng cch thm vo:
public static readonly Pair.WhichIsFirst OrderStudents =
new Pair.WhichIsFirst(Student.WhichStudentComesFirst);
ngha ca lnh trn l to mt y quyn tnh tn l OrderStudents v 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 Cat nh sau:
public static readonly Pair.WhichIsFirst OderCats =
new Pair.WhichIsFirst( Cat.WhichCatComesFirst);
By gi th c hai trng tnh hin din bn trong cc lp Student v 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(Sau khi sap xep studentPair\t\t:{0}, studentPair.ToString());
studentPair.ReverseSort(Student.OrderStudents);
Console.WriteLine(Sau khi sap xep nguoc studentPair\t\t:{0},
CChyQuyn-SKin
315
NgnNgLpTrnhC#
studentPair.ToString());
catPair.Sort( theCatDelegate);
Console.WriteLine(Sau khi sap xep catPair\t\t:{0}, catPair.ToString());
catPair.ReverseSort(Cat.OrderCats);
Console.WriteLine(Sau khi sap xep nguoc catPair\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 Student v Cat trong 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 Student ta c th chuyn khai bo:
public static readonly Pair.WhichIsFirst OrderStudent =
new Pair.WhichIsFirst( Student.WhichStudentComesFirst);
thnh khai bo nh sau:
public static Pair.WhichIsFirst OrderStudents
{
get
{
return new Pair.WhichIsFirst( WhichStudentComesFirst);
}
}
Tng t nh vy chng ta thc hin thay th vi lp Cat:
public static Pair.WhichIsFirst OderCats
{
get
{
return new Pair.WhichIsFirst( WhichCatComesFirst);
}
}
Khi truyn cho phng thc th khng thay i:
studentPair.Sort( Student.OderStudents);
catPair.Sort( Cat.OrderCats);
Khi thuc tnh OrderStudents c truy cp th y quyn c to ra:
return new Pair.WhichIsFirst( WhichCatComesFirst);
CChyQuyn-SKin
316
NgnNgLpTrnhC#
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 Student hay 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 Image th hin mt nh s c x l bi lp
ImageProcessor:
public class Image
{
public Image()
{
Console.WriteLine(An image created);
}
}
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 ImageProcessor khai 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:
public delegate void DoEffect();
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:
public static void Blur()
{
Console.WriteLine(Blurring image);
}
CChyQuyn-SKin
317
NgnNgLpTrnhC#
public static void Filter()
{
Console.WriteLine(Filtering image);
}
public static void Sharpen()
{
Console.WriteLine(Sharpening image);
}
public static void Rotate()
{
Console.WriteLine(Rotating image);
}
Lp ImageProcessor cn 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;
Image image;
int numEffectsRegistered = 0;
ImageProcessor cng cn mt phng thc thm cc y quyn vo trong mng:
public void AddToEffects( DoEffect theEffect)
{
if (numEffectsRegistered >=0)
{
throw new Exception(Too many members in array);
}
arrayOfEffects[numEffectsRegistered ++] = theEffect;
}
Ngoi ra cn cn mt phng thc tht s gi cc y quyn ny:
public void ProcessImage()
{
for (int i = 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:
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect SharpenEffect = new DoEffect(Sharpen);
CChyQuyn-SKin
318
NgnNgLpTrnhC#
public DoEffect FilterEffect = new DoEffect(Filter);
public DoEffect RotateEffect = new DoEffect(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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// khai bo lp nh
public class Image
{
public Image()
{
Console.WriteLine(An image created);
}
}
// lp x l nh
public class ImageProcessor
{
// khai bo y quyn
public delegate void DoEffect();
// to cc y quyn tnh
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect SharpenEffect = new DoEffect(Sharpen);
public DoEffect FilterEffect = new DoEffect(Filter);
public DoEffect RotateEffect = new DoEffect(Rotate);
// b khi dng khi to nh v mng
public ImageProcessor(Image image)
{
this.image = image;
arrayOfEffects = new DoEffect[10];
}
// thm hiu ng vo trong mng
public void AddToEffects( DoEffect theEffect)
{
if (numEffectsRegistered >=0)
CChyQuyn-SKin
319
NgnNgLpTrnhC#
{
throw new Exception(Too many members in array);
}
arrayOfEffects[numEffectsRegistered ++] = theEffect;
}
// cc phng thc x l nh
public static void Blur()
{
Console.WriteLine(Blurring image);
}
public static void Filter()
{
Console.WriteLine(Filtering image);
}
public static void Sharpen()
{
Console.WriteLine(Sharpening image);
}
public static void Rotate()
{
Console.WriteLine(Rotating image);
}
// gi cc y quyn thc hin hiu ng
public void ProcessImage()
{
for (int i = 0; i < numEffectsRegistered; i++)
{
arrayOfEffects[i]();
}
}
// bin thnh vin
private DoEffect[] arrayOfEffects;
private Image image;
private int numEffectsRegistered = 0;
}
// lp Test kim chng chng trnh
public class Test
{
CChyQuyn-SKin
320
NgnNgLpTrnhC#
public static void Main()
{
Image theImage = new Image();
// do khng c GUI thc hin chng ta s chn ln
// lt cc hnh ng v thc hin
ImageProcessor theProc = new ImageProcessor(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.
CChyQuyn-SKin
321
NgnNgLpTrnhC#
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 void l 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 Transmitter vo
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:
void delegate void StringDelegate( string s);
Sau chng ta nh mt lp gi l MyImplementingClass lp 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(String passed to Writer\n);
Logger(String passed to Logger\n);
Transmitter(String passed to Transmitter\n);
xem cch kt hp cc delegate, chng ta to mt th hin delegate khc:
MyClassWithDelegate.StringDelegate myMulticastDelegate;
CChyQuyn-SKin
322
NgnNgLpTrnhC#
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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class MyClassWithDelegate
{
// khai bo delegate
public delegate void StringDelegate(string s);
}
public class MyImplementingClass
{
public static void WriteString( string s)
{
Console.WriteLine(Writing string {0}, s);
}
public static void LogString( string s)
{
Console.WriteLine(Logging string {0}, s);
}
public static void TransmitString( string s)
{
Console.WriteLine(Transmitting string {0}, s);
}
}
public class Test
{
public static void Main()
{
// nh ngha 3 StringDelegate
MyClassWithDelegate.StringDelegate Writer, Logger, Transmitter;
CChyQuyn-SKin
323
NgnNgLpTrnhC#
// nh ngha mt StringDelegate khc thc hin Multicasting
MyClassWithDelegate.StringDelegate myMulticastDelegate;
// to th hin ca 3 delegate u tin v truyn vo phng thc thc thi
Writer = new MyClassWithDelegate.StringDelegate(
MyImplementingClass.WriteString);
Logger = new MyClassWithDelegate.StringDelegate(
MyImplementingClass.LogString);
Transmitter = new MyClassWithDelegate.StringDelegate(
MyImplementingClass.TransmitString);
// gi phng thc delegate Writer
Writer(String passed to Writer\n);
// gi phng thc delegate Logger
Logger(String passed to Logger\n);
//gi phng thc delegate Transmitter
Transmitter(String passed to Transmitter\n);
// thng bo ngi dng rng kt hp hai delegate vo
// trong mt multicast delegate
Console.WriteLine(myMulticastDelegate = Writer + Logger);
// kt hp hai delegate
myMulticastDelegate = Writer + Logger;
// gi phng thc delegate, hai phng thc s c thc hin
myMulticastDelegate(First string passed to Collector);
// bo vi ngi s dng rng thm delegate th 3 vo
// trong Multicast delegate
Console.WriteLine(\nmyMulticastDeleagte += Transmitter);
// thm delegate th ba vo
myMulticastDelegate += Transmitter;
// gi thc thi Multicast delegate, cng mt lc ba
// phng thc s cng c gi thc hin
myMulticastDelegate(Second string passed to Collector);
// bo vi ngi s dng rng xa delegate Logger
Console.WriteLine(\nmyMulticastDelegate -= Logger);
// xa delegate Logger
myMulticastDelegate -= Logger;
// gi li delegate, lc ny ch cn thc hin hai phng thc
myMulticastDelegate(Third string passed to Collector);
}// end Main
}// end class
CChyQuyn-SKin
324
NgnNgLpTrnhC#
}// end namespace
-----------------------------------------------------------------------------
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 myMulticastDelegate c 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.
CChyQuyn-SKin
325
NgnNgLpTrnhC#
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 EventArgs cha 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 Clock dng 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
member- name
V d khai bo nh sau:
CChyQuyn-SKin
326
NgnNgLpTrnhC#
public event SecondChangeHandler OnSecondChange;
Trong v d ny ta khng dng thuc tnh, modifier y l abstract, new, override,
static, virtual, 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:
public delegate void SecondChangeHandler( object clock,
TimeInfoEventArgs timeInformation);
Nh ni trc y, theo quy c mt trnh x l s kin phi tr v gi tr void v 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 TimeInfoEventArgs c nh ngha nh sau:
public class TimeInfoEventArgs : EventArgs
{
public TimeInfoEventArgs(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
public readonly int hour;
public readonly int minute;
public readonly int second;
}
i tng TimeInfoEventArgs s 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 Clock c ba bin thnh vin l :
hour, minute, v second. Cui cng l mt phng thc Run():
public void Run()
{
for(;;)
{
// ngng 10 giy
Thread.Sleep( 10 );
CChyQuyn-SKin
327
NgnNgLpTrnhC#
// ly thi gian hin hnh
System.DateTime dt = System.DateTime.Now;
// nu giy thay i cnh bo cho subscriber
if ( dt.Second != second)
{
// to TimeInfoEventArgs truyn
// cho subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
// nu c bt c lp no ng k th cnh bo
if ( OnSecondChange != null)
{
OnSecondChange( this, timeInformation);
}
}
// cp nht trng thi
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 Thread t System.Threading ca .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.DateTime dt = 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)
{
// to TimeInfoEventArgs truyn cho cc subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
CChyQuyn-SKin
328
NgnNgLpTrnhC#
}
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 null hay 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 TimeInfo-
EventArgs c 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:
public class DisplayClock
{
public void Subscrible(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(TimeHasChanged);
}
public void TimeHasChanged( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(Current Time: {0]:{1}:{2},
ti.hour.ToString(), ti.minute.ToString(),
ti.Second.ToString());
CChyQuyn-SKin
329
NgnNgLpTrnhC#
}
}
Khi phng thc u tin Subscribe c gi, n s to ra mt delegate SecondChange-
Handler mi, v truyn vo phng thc x l s kin TimeHasChanged ca n. Sau n
s ng k delegate vi s kin OnSecondChange ca 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:
public class LogCurrentTime
{
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(WriteLogEntry);
}
// thng thng phng thc ny vit ra file
// nhng trong minh ha ny chng ta ch xut
// ra mn hnh console m thi
public void WriteLogEntry( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(Logging to file: {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 OnSecondChange ca i tng Clock m 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
DisplayClock trc .
Tt c phn cn li cn thc hin l to ra mt lp Clock, to m i tng DisplayClock v
bo n ng k s kin. Sau chng ta to ra mt i tng LogCurrentTime v 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
CChyQuyn-SKin
330
NgnNgLpTrnhC#
{
using System;
using System.Threading;
// lp lu gi thng tin v s kin, trong trng hp
// ny n ch lu gi nhng thng tin c gi tr lp clock
public class TimeInfoEventArgs : EventArgs
{
public TimeInfoEventArgs(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
public readonly int hour;
public readonly int minute;
public readonly int second;
}
// khai bo lp Clock lp ny s pht ra cc s kin
public class Clock
{
// khai bo delegate m cc subscriber phi thc thi
public delegate void SecondChangeHandler(object clock,
TimeInfoEventArgs timeInformation);
// s kin m chng ta a ra
public event SecondChangeHandler OnSecondChange;
// thit lp ng h thc hin, s pht ra mi s kin trong mi giy
public void Run()
{
for(;;)
{
// ngng 10 giy
Thread.Sleep( 10 );
// ly thi gian hin hnh
System.DateTime dt = System.DateTime.Now;
// nu giy thay i cnh bo cho subscriber
if ( dt.Second != second)
{
// to TimeInfoEventArgs truyn
CChyQuyn-SKin
331
NgnNgLpTrnhC#
// cho subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
// nu c bt c lp no ng k th cnh bo
if ( OnSecondChange != null)
{
OnSecondChange( this, timeInformation);
}
}
// cp nht trng thi
this.second = dt.Second;
this.minute = dt.Minute;
this.hour = dt.Hour;
}
}
private int hour;
private int minute;
private int second;
}
// lp DisplayClock ng k s kin ca clock.
// thc thi x l s kin bng cch hin thi gian hin hnh
public class DisplayClock
{
public void Subscrible(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(TimeHasChanged);
}
public void TimeHasChanged( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(Current Time: {0}:{1}:{2},
ti.hour.ToString(),
ti.minute.ToString(),
ti.second.ToString());
}
}
// lp ng k s kin th hai
public class LogCurrentTime
CChyQuyn-SKin
332
NgnNgLpTrnhC#
{
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(WriteLogEntry);
}
// thng thng phng thc ny vit ra file
// nhng trong minh ha ny chng ta ch xut
// ra mn hnh console m thi
public void WriteLogEntry( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(Logging to file: {0}:{1}:{2},
ti.hour.ToString(),
ti.minute.ToString(),
ti.second.ToString());
}
}
// lp Test minh ha s dng s kin
public class Test
{
public static void Main()
{
// to ra i tng clock
Clock theClock = new Clock();
// to i tng DisplayClock ng k
// s kin v x l s kin
DisplayClock dc = new DisplayClock();
dc.Subscribe(theClock);
// to i tng LogCurrent v yu cu ng
// k v x l s kin
LogCurrentTime lct = new LogCurrentTime();
lct.Subscribe(theClock);
// bt u thc hin vng lp v pht sinh s kin
// trong mi giy ng h
theClock.Run();
}
}
}
CChyQuyn-SKin
333
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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.OnSecondChange ca
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 Clock cng
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
Cu hi 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.
Cu hi 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 ?
CChyQuyn-SKin
334
NgnNgLpTrnhC#
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?
Cu hi 6: Cc ton t no c th dng thc hin vic Multicast cc y quyn?
Cu hi 7: S kin l g? Trong h thng ng dng no th s kin c s dng nhiu?
Cu hi 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.
CChyQuyn-SKin
335
NgnNgLpTrnhC#
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.
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.
CcLpCS.NET
336
NgnNgLpTrnhC#
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 System l 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 tt
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.
CcLpCS.NET
337
NgnNgLpTrnhC#
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: Hin th ngy v thi gian
// nhn Ctrl+C thot
namespace Programming_CSharp
{
using System;
public class Tester
{
public static void Main()
{
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
CcLpCS.NET
338
NgnNgLpTrnhC#
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 System bn trong th vin c s. Cu trc ny c mt thuc tnh tnh l Now tr
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 Timer cho 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: hiu th ngy gi s dng Timer
// nhn Ctrl+C hay q v Enter thot
namespace Programming_CSharp
{
using System;
using System.Timers;
public class Tester
{
public static void Main()
{
Timer myTimer = new Timer();
// khai bo hm x l
myTimer.Elapsed += new ElapsedEventHandler( DisplayTimeEvent);
// khong thi gian delay
myTimer.Interval = 1000;
myTimer.Start();
// thc hin vng lp ch thot
while ( Console.Read() != q)
{
; // khng lm g ht!
}
}
public static void DisplayTimeEvent( object source, ElapsedEventArgs t)
{
CcLpCS.NET
339
NgnNgLpTrnhC#
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 Timer cng 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 Timer ny 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
CcLpCS.NET
340
NgnNgLpTrnhC#
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: hin th thng tin ca lp Environment
namespace Programming_CSharp
{
using System;
class Tester
{
public static void Main()
{
// cc thuc tnh
Console.WriteLine(**************************);
Console.WriteLine(Command: {0}, Environment.CommandLine);
Console.WriteLine(Curr Dir: {0}, Environment.CurrentDirectory);
Console.WriteLine(Sys Dir: {0}, Environment.SystemDirectory);
Console.WriteLine(Version: {0}, Environment.Version);
Console.WriteLine(OS Version: {0}, Environment.OSVersion);
Console.WriteLine(Machine: {0}, Environment.MachineName);
Console.WriteLine(Memory: {0}, Environment.WorkingSet);
// dng mt vi cc phng thc
Console.WriteLine(**************************);
string [] args = Environment.GetCommandLineArgs();
for( int i = 0; i < args.Length; i++)
{
Console.WriteLine(Arg {0}: {1}, i, args[i]);
}
Console.WriteLine(**************************);
string [] drivers = Environment.GetLogicalDrives();
for( int i = 0; i < drivers.Length; i++)
{
Console.WriteLine(Drive {0}: {1}, i, drivers[i]);
}
Console.WriteLine(**************************);
Console.WriteLine(Path: {0},
Environment.GetEnvironmentVariable(Path));
CcLpCS.NET
341
NgnNgLpTrnhC#
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 Command-
Line. 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 GetCommandLineArgs v 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.
CcLpCS.NET
342
NgnNgLpTrnhC#
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 M t
Abs Tr v tr tuyt i ca mt s
Ceiling Tr v gi tr nh nht hay bng gi tr a ra
Exp Tr v gi tr e vi m a ra
Floor Tr v gi tr ln nht hay bng gi tr a ra
IEEERemainder Tr v phn d ca php chia hai hai s thc. Php
chia ny theo tiu chun ca IEEE cho php ton du
chm ng nh phn.
Log Tr v gi tr logarit ca gi tr a ra
Log10 Tr v gi tr logarit c s 10 ca s a ra
Max Tr v s ln trong hai s
Min Tr v s nh trong hai s
Pow Tr v kt qu x
y
Round Tr v gi tr c lm trn
Sign Tr v gi tr du ca mt s. -1 nu s m v 1 nu
s dng
Sqrt Tr v cn bc hai ca mt s
Acos Tr v gi tr mt gc m cosin bng vi gi tr a ra
Asin Tr v gi tr mt gc m sin bng vi gi tr a ra
Atan Tr v gi tr ca mt gc m tang bng vi gc a
ra
Atan2 Tr v gi tr ca mt gc m tang bng vi tang ca
im (x,y) a ra
Cos Tr v gi tr cosin ca mt gc a ra
Cosh Tr v gi tr hyperbolic cosin ca gc a ra
Sin Tr v gi tr sin ca gc a ra
CcLpCS.NET
343
NgnNgLpTrnhC#
Sinh Tr v gi tr hyperbolic ca gc a ra
Tan Tr v gi tr tang ca gc
Tanh Tr v gi tr hyperbolic tang ca gc.
Hnh 12.1 : Phng thc ca Math.
Ngoi ra lp Math ny cng a vo hai hng s: PI v s E, PI tr v gi tr pi trong ton hc
nh l 3.14159265358979323846 Gi tr E tr 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.
-----------------------------------------------------------------------------
using System;
namespace Programming_CSharp
{
public class Tester
{
public static void Main()
{
int val2;
char ch;
for(double ctr = 0.0; ctr <= 10; ctr += .2)
{
val2 = (int) System.Math.Round((10*System.Math.Sin(ctr)));
for( int ctr2 = -10; ctr2 <=10; ctr2++)
{
if (ctr2 == val2)
ch = 'x';
else
ch = ' ';
Console.Write("{0}", ch);
}
Console.WriteLine(" ");
}
}
}
}
-----------------------------------------------------------------------------
Kt qu:
x
CcLpCS.NET
344
NgnNgLpTrnhC#
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
CcLpCS.NET
345
NgnNgLpTrnhC#
x
x
x
x
x
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
for th 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 File iu l tnh. Bng 12.2 lit k
nhng phng thc chnh ca lp File.
Lp File
Phng thc M t
AppendText Ni vn bn vo trong mt tp tin
Copy To ra mt tp tin mi t tp tin hin hu
CcLpCS.NET
346
NgnNgLpTrnhC#
Create To ra mt tp tin mi mt v tr xc nh
CreateText To ra tp tin lu gi text
Delete Xa tp tin v tr xc nh. Tp tin phi hin hu
nu khng s pht sinh ra ngoi l.
Exists Kim tra xem tp tin c thc s hin hu v tr no
.
GetAttributes Ly thng tin thuc tnh ca tp tin. Thng tin ny
bao gm: tp tin c b nn hay khng, tn th mc, c
thuc tnh n, thuc tnh ch c, tp tin h thng...
GetCreationTime Tr v ngy gi tp tin c to ra
GetLastAccessTime Tr v ngy gi tp tin c truy cp ln cui
GetLastWriteTime Tr v ngy gi tp tin c vit ln cui
Move Cho php tp tin c di chuyn vo v tr mi v i
tn tp tin.
Open 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
n.
OpenRead M mt tp tin hin hu c
OpenText M mt tp tin c dng text
OpenWrite M mt tp tin xc nh vit
SetAttributes Thit lp thuc tnh cho tp tin
SetCreationTime Thit lp ngy gi to tp tin
SetLastAccessTime Thit lp li ngy gi m tp tin c truy cp ln
cui
SetLastWriteTime Thit lp ngy gi m tp tin c cp nht ln cui.
Bng 12.2 : Mt s 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: sao chp mt tp tin
// s dng tham s dng lnh
namespace Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main()
CcLpCS.NET
347
NgnNgLpTrnhC#
{
string[] CLA = Environment.GetCommandLineArgs();
if ( CLA.Length < 3)
{
Console.WriteLine(Format: {0} orig-file new-file, CLA[0]);
}
else
{
string origfile = CLA[1];
string newfile = CLA[2];
Console.Write(Copy...);
try
{
File.Copy(origfile, newfile);
}
catch (System.IO.FileNotFoundException)
{
Console.WriteLine(\n{0} does not exist!, origfile);
return;
}
catch (System.IO.IOException)
{
Console.WriteLine(\n{0} already exist!, newfile);
return;
}
catch (Exception e)
{
Console.WriteLine(\nAn exception was thrown trying to copy file);
Console.WriteLine();
return;
}
Console.WriteLine(...Done);
}
}
}
}
-----------------------------------------------------------------------------
CcLpCS.NET
348
NgnNgLpTrnhC#
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.exe filecopy.cs filecopy.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.bak already exists!
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 :
Format d:\working\filecopy\filecopy.exe orig-file new-file
Cui cng, iu t nht xy ra l chng ta thc hin sao chp nhng tp tin ngun khng tn
ti:
Copy...
filecopy.cs does not exist!
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 Environment ny
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} orig-file new-file, 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:
CcLpCS.NET
349
NgnNgLpTrnhC#
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 Copy ca File
c bao bc trong khi try, v sau l ba th hin ca Catch theo 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} does not exist!, 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.
CcLpCS.NET
350
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
// Filsize.cs
namespace Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main()
{
string[] CLA = Environment.GetCommandLineArgs();
FileInfo fiExe = new FileInfo( CLA[0] );
if ( CLA.Length < 2)
{
Console.WriteLine(Format: {0} filename, fiExe.Name);
}
else
{
try
{
FileInfo fiFile = new FileInfo( CLA[1]);
if (fiFile.Exists)
{
Console.WriteLine(******************************);
Console.WriteLine({0} {1},fiFile.Name, fiFile.Length);
Console.WriteLine(******************************);
Console.WriteLine(Last access: {0},fiFile.LastAccessTime);
Console.WriteLine(Last write: {0}, fiFile.LastWriteTime);
Console.WriteLine(Creation: {0}, fiFile.CreationTime);
Console.WriteLine(******************************);
}
else
{
Console.WriteLine({0} doesnt exist!, fiFile.Name);
}
}
catch (System.IO.FileNotFoundException)
{
CcLpCS.NET
351
NgnNgLpTrnhC#
Console.WriteLine(\n{0} does not exists!, CLA[1]);
return;
}
catch (Exception e)
{
Console.WriteLine(\n An exception was thrown trying to copy file);
Console.WriteLine();
return;
}// end catch
}// end else
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
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 FileInfo c to ra v gn vi mt tp tin tng ng:
FileInfo fiInfo = new FileInfo( 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.
CcLpCS.NET
352
NgnNgLpTrnhC#
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 n.
To lung StreamWriter s dng thm vo trong vn bn.
Create To mi mt tp tin
CreateText To v m mt tp tin vn bn. To ra mt lung StreamWriter.
Open M mt tp tin c/vit. M mt FileStream
OpenRead M mt tp tin c
OpenText M mt tp tin vn bn c. To ra StreamReader s dng.
OpenWrite M mt tp tin cho vic c v ghi.
CcLpCS.NET
353
NgnNgLpTrnhC#
Lm th no chng ta c th bit c khi no s dng lp File chnh xc hn l s dng
lp FileInfo nu chng cng cha nhng phng thc tng t vi nhau. Tht ra hai lp ny
c nhiu s khc bit. Lp File cha tt c cc phng thc tnh, thm vo lp File t ng
kim tra permission trn mt tp tin. Trong khi nu mun dng lp FileInfo th 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:: vit vo mt tp tin vn bn
namespace Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main(String[] args)
{
if (args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin.);
}
else
{
StreamWriter myFile = File.CreateText( args[0]);
myFile.WriteLine(Khong co viec gi kho);
myFile.WriteLine(Chi so long khong ben);
myFile.WriteLine(Dao nui va lap bien);
myFile.WriteLine(Quyet chi at lam nen);
for(int i=0; i < 10; i++)
{
CcLpCS.NET
354
NgnNgLpTrnhC#
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:
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
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 Main c 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 CreateText ca lp File c gi to ra mt i tng StreamWriter mi 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
StreamWriter vi 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
CcLpCS.NET
355
NgnNgLpTrnhC#
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(Khong co viec gi kho);
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.
-----------------------------------------------------------------------------
using System;
using System.IO;
namespace Programming_CSharp
{
public class Tester
{
public static void Main(string[] args)
{
if ( args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin);
}
else
{
CcLpCS.NET
356
Data to
be written
arg[0]
myFile - StreamWriter
Disk file
NgnNgLpTrnhC#
string buffer;
StreamReader myFile = 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 myFile thc 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 Close c 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
CcLpCS.NET
357
NgnNgLpTrnhC#
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 BinaryStream vo 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
using System;
using System.IO;
namespace Programming_CSharp
{
public class Tester
{
public static void Main(string[] args)
{
if ( args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin!);
}
else
{
FileStream myFile = new FileStream( args[0], FileMode.CreateNew);
BinaryWriter bwFile = new BinaryWriter(myFile);
for (int i=0; i < 100; i++)
{
bwFile.Write(i);
}
bwFile.Close();
myFile.Close();
}
CcLpCS.NET
358
NgnNgLpTrnhC#
}
}
}
-----------------------------------------------------------------------------
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:
FileStream myFile = new FileStream( 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 nh ngha
Append M mt tp tin hin hu hoc to mt tp tin mi
Create To mt tp tin mi. Nu mt tp tin hin hu, n s
b xa v mt tp tin mi s c to ra vi cng tn.
CreateNew To mt tp tin mi. Nu mt tp tin tn ti th mt
ngoi l s c pht sinh.
Open M tp tin hin hu.
OpenOrCreate M tp tin hay to tp tin mi nu tp tin cha tn ti
Truncate 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:
BinaryWriter bwFile = new BinaryWriter(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 bwFile c to ra. myFile c truyn
vo b khi dng BinaryWrite, n s gn bwFile vi myFile.
for (int i=0; i < 100; i++)
{
bwFile.Write(i);
CcLpCS.NET
359
NgnNgLpTrnhC#
}
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: Doc thong tin tu file nhi phan
namespace Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main( String[] args)
{
if ( args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin);
}
else
{
FileStream myFile = new FileStream( args[0], FileMode.Open);
BinaryReader brFile = new BinaryReader(myFile);
// c d liu
Console.WriteLine(Dang doc tap tin....);
while (brFile.PeekChar() != -1)
{
Console.Write(<{0}>, brFile.ReadInt32());
}
Console.WriteLine(....Doc xong);
brFile.Close();
CcLpCS.NET
360
NgnNgLpTrnhC#
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 BinaryReader
trong dng tip sau, lung ny s gip cho chng ta c thng tin nh phn:
FileStream myFile = new FileStream( args[0], FileMode.Open);
BinaryReader brFile = new BinaryReader(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 BinaryStream brFile.
CcLpCS.NET
361
NgnNgLpTrnhC#
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 BinaryReader cn 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 ReadInt32 c
s dng trong chng trnh. Bng 12.4 sau lit k mt s phng thc dng c cc kiu
d liu.
Phng thc ngha
Read c nhng k t v chuyn v tr c sang v tr tip theo.
Phng thc ny c np chng gm 3 phng thc.
ReadBoolean c mt gi tr boolean t lung hin thi v chuyn v tr c
sang mt byte.
ReadByte c byte k tip t lung hin thi v chuyn v tr c sang 1
byte.
ReadBytes c n byte t lung hin thi sang mt mng byte v chuyn v
tr c sang n byte.
ReadChar c v tr k tip trong lung hin hnh v chuyn v tr c ca
lung theo sau s dng m ha v k t xc nh c c t
lung.
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
xc nh c c t lung.
ReadDecimal c gi tr decimal v chuyn v tr c sang 16 byte.
ReadDouble c gi tr thc 8 byte v chuyn v tr c sang 8 byte.
ReadInt16 c gi tr 2 byte integer c du v chuyn v tr c sang 2
byte.
ReadInt32 c gi tr 4 byte integer c du v chuyn v tr c sang 4
byte.
ReadInt64 c gi tr 8 byte integer c du v chuyn v tr c sang 8 byte
ReadSByte c mt signed byte t lung v chuyn v tr c sang 1 byte.
ReadSingle c gi tr thc 4 byte t lung v chuyn v tr c sang 4 byte.
ReadString c mt chui t lung. Chui c c nh chiu di trc.
V c m ha mi ln nh l s nguyn 7 bit.
ReadUInt16 c gi tr 2-byte unsigned integer t lung. S dng m ha
th t nh cui (little endian encoding). V chuyn v tr hin
hnh sang 2 byte.
CcLpCS.NET
362
NgnNgLpTrnhC#
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
Cu hi 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
Cu hi 1: truy xut thi gian ca ng h h thng chng ta phi dng lp no?
Cu hi 2: Thng tin v my tnh c th c truy xut thng qua lp no?
Cu hi 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?
Cu hi 6: Lp no cung cp cc thng tin v tp tin? Cc phng thc chnh ca lp ny?
Cu hi 7: Lung l g? Phn bit gia tp tin v lung?
Cu hi 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
CcLpCS.NET
363
NgnNgLpTrnhC#
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 tp 4: 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.
CcLpCS.NET
364
NgnNgLpTrnhC#
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 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.
XLNgoiL
365
NgnNgLpTrnhC#
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 System ca 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.Exception v sau throw n:
throw new System.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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
{
XLNgoiL
366
NgnNgLpTrnhC#
public static void Main()
{
Console.WriteLine(Enter Main....);
Test t = new Test();
t.Func1();
Console.WriteLine(Exit Main...);
}
public void Func1()
{
Console.WriteLine(Enter Func1...);
Func2();
Console.WriteLine(Exit Func1...);
}
public void Func2()
{
Console.WriteLine(Enter Func2...);
throw new System.Exception();
Console.WriteLine(Exit Func2...);
}
}
}
-----------------------------------------------------------------------------
Kt qu:
Enter Main....
Enter Func1...
Enter 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 System.Exception. Vic thc
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 stack ly hm gi trc tc l Func1 v tm kim
XLNgoiL
367
NgnNgLpTrnhC#
trnh x l ngoi l. Mt ln na trong Func1 cng 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 catch v c to ra vi t kha catch.
Trong v d 13.2 sau, cu lnh throw c 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Console.WriteLine(Enter Main...);
Test t = new Test();
t.Func1();
Console.WriteLine(Exit Main...);
}
public void Func1()
{
Console.WriteLine(Enter Func1...);
Func2();
Console.WriteLine(Exit Func1...);
}
public void Func2()
{
Console.WriteLine(Enter Func2...);
try
{
Console.WriteLine(Entering try block...);
throw new System.Exception();
Console.WriteLine(Exiting try block...);
}
XLNgoiL
368
NgnNgLpTrnhC#
catch
{
Console.WriteLine(Exception caught and handled.);
}
Console.WriteLine(Exit Func2...);
}
}
}
-----------------------------------------------------------------------------
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 try l cu lnh catch tng qut. Cu lnh catch trong 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 catch n 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?
XLNgoiL
369
NgnNgLpTrnhC#
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 try khng c thc hin. Trong trng hp ny
chng ta s khng bao gi nhn c thng bo Exiting try block..... Khi lnh catch x l
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/catch ln hm Func1 nh trong v d minh ha
13.3 bn di.
V d 13.3: Catch trong hm gi.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Console.WriteLine(Enter Main...);
Test t = new Test();
t.Func1();
Console.WriteLine(Exit Main...);
}
public void Func1()
{
Console.WriteLine(Enter Func1...);
try
{
Console.WriteLine(Entering try block...);
Func2();
Console.WriteLine(Exiting try block...);
}
catch
{
Console.WriteLine(Exception caught and handled.);
}
Console.WriteLine(Exit Func1...);
XLNgoiL
370
NgnNgLpTrnhC#
}
public void Func2()
{
Console.WriteLine(Enter Func2...);
throw new System.Exception();
Console.WriteLine(Exit Func2...);
}
}
}
-----------------------------------------------------------------------------
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 catch s 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 catch xc nh:
Cho n by gi chng ta ch dng khi catch tng 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
XLNgoiL
371
NgnNgLpTrnhC#
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// ta th chia hai phn x l ngoi l ring
public void TestFunc()
{
try
{
double a = 5;
double b = 0;
Console.WriteLine({0} / {1} = {2}, a, b, DoDivide(a,b));
}
catch (System.DivideByZeroException)
{
Console.WriteLine(DivideByZeroException caught!);
}
catch (System.ArithmeticException)
{
Console.WriteLine(ArithmeticException caught!);
}
catch
{
Console.WriteLine(Unknown exception caught);
}
}
// thc hin php chia hp l
public double DoDivide(double a, double b)
{
if ( b == 0)
throw new System.DivideByZeroException();
if ( a == 0)
throw new System.ArithmeticException();
return a/b;
}
}
XLNgoiL
372
NgnNgLpTrnhC#
}
-----------------------------------------------------------------------------
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 Divide-
ByzeroException 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=5 v b=7 th 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:
ArithmeticException caught!
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 ArithmeticException c 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 DivideByZero-
Exception 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 Arith-
meticException. 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
E 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.
XLNgoiL
373
NgnNgLpTrnhC#
Cu lnh finally
Trong mt s tnh hung, vic pht sinh ngoi l v unwind stack c 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.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// chia hai s v x l ngoi l nu c
public void TestFunc()
{
try
XLNgoiL
374
NgnNgLpTrnhC#
{
Console.WriteLine(Open file here);
double a = 5;
double b = 0;
Console.WriteLine({0} /{1} = {2}, a, b, DoDivide(a,b));
Console.WriteLine(This line may or not print);
}
catch (System.DivideByZeroException)
{
Console.WriteLine(DivideByZeroException caught!);
}
catch
{
Console.WriteLine(Unknown exception caught);
}
finally
{
Console.WriteLine(Close file here.);
}
}
// thc hin chia nu hp l
public double DoDivide(double a, double b)
{
if ( b == 0)
{
throw new System.DivideByZeroException();
}
if ( a == 0)
{
throw new System.ArithmeticException();
}
return a/b;
}
}
}
-----------------------------------------------------------------------------
Kt qu:
Open file here
XLNgoiL
375
NgnNgLpTrnhC#
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 catch c 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 finally cng 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 Message l thuc tnh ch c, on chng trnh
pht sinh ngoi l c th thit lp thuc tnh Message nh l mt i mc cho b khi dng
ca ngoi l. Thuc tnh HelpLink cung cp mt lin kt tr gip cho cc tp tin lin quan
n cc ngoi l. y l thuc tnh ch c. Thuc tnh StackTrace cng 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.
Thuc tnh StackTrace ca ngoi l c s dng cung cp thng tin stack cho cu lnh
li. Mt thng tin stack cung cp hng lot cc cuc gi stack ca phng thc gi m dn
n nhng ngoi l c pht sinh.
V d 13.6: Lm vic vi i tng ngoi l.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// chia hai s v x l ngoi l
XLNgoiL
376
NgnNgLpTrnhC#
public void TestFunc()
{
try
{
Console.WriteLine(Open file here);
double a = 12;
double b = 0;
Console.WriteLine({0} /{1} = {2}, a, b, DoDivide(a,b));
Console.WriteLine(This line may or not print);
}
catch (System.DivideByZeroException e)
{
Console.WriteLine(\nDivideByZeroException! Msg: {0}, e.Message);
Console.WriteLine(\nHelpLink: {0}, e.HelpLink);
Console.WriteLine(\nHeres a stack trace: {0}\n, e.StackTrace);
}
catch
{
Console.WriteLine(Unknown exception caught);
}
}
// thc hin php chia hp l
public double DoDivide( double a, double b)
{
if ( b == 0)
{
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = http://www.hcmunc.edu.vn;
throw e;
}
if ( a == 0)
{
throw new ArithmeticException();
}
return a/b;
}
}
}
XLNgoiL
377
NgnNgLpTrnhC#
-----------------------------------------------------------------------------
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:
DivideByZeroException e = new DivideByZeroException();
Chng ta khng truyn vo thng ip ca chng ta, nn thng ip mc nh s c in ra:
DivideByZeroException! Msg: Attemped to divide by zero.
y chng ta c th b sung nh dng lnh bn di truyn vo thng ip ca chng ta
ty chn nh sau:
new DivideByZeroException(You tried to divide by zero which is not meaningful);
Trc khi pht sinh ra ngoi l, chng ta thit lp thuc tnh HelpLink nh sau:
e.HelpLink = http://www.hcmunc.edu.vn;
Khi ngoi l c bt gi, chng trnh s in thng ip v HelpLink ra mn hnh:
catch (System.DivideByZeroException e)
{
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(\n Heres a stack trace: {0}\n, e.StackTrace);
Kt qu l cc vt trong stack s c xut ra:
Heres a stack trace:
at Programming_CSharp.Test.DoDivide(Double c, Double b)
XLNgoiL
378
NgnNgLpTrnhC#
in c:\...exception06.cs: line 56
at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22.
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.
CC LP NGOI L
Tn ngoi l M t
MethodAccessException Li truy cp, do truy cp n thnh vin hay
phng thc khng c truy cp
ArgumentException Li tham s i mc
ArgumentNullException i mc Null, phng thc c truyn i mc
null khng c chp nhn
ArithmeticException Li lin quan n cc php ton
ArrayTypeMismatchException Kiu mng khng hp, khi c lu tr kiu khng
thch hp vo mng
DivideByZeroException Li chia zero
FormatException nh dng khng chnh xc mt i mc no
IndexOutOfRangeException Ch s truy cp mng khng hp l, dng nh hn
ch s nh nht hay ln hn ch s ln nht ca
mng
InvalidCastException Php gn khng hp l
MulticastNotSupportedException Multicast khng c h tr, do vic kt hp hai
delegate khng ng
NotFiniteNumberException Khng phi s hu hn, s khng hp l
NotSupportedException Phng thc khng h tr, khi gi mt phng
thc khng tn ti bn trong lp.
NullReferenceException Tham chiu null khng hp l.
OutOfMemoryException Out of memory
OverflowException Li trn php ton
StackOverflowException Trn stack
TypeInitializationException Kiu khi to sai, khi b khi dng tnh c li.
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
XLNgoiL
379
NgnNgLpTrnhC#
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
{
using System;
// to ngoi l ring
public class MyCustomException : System.ApplicationException
{
public MyCustomException( string message): base(message)
{
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// chia hai s v x l ngoi l
public void TestFunc()
{
try
{
Console.WriteLine(Open file here);
double a = 0;
double b = 5;
Console.WriteLine({0} /{1} = {2}, a, b, DoDivide(a,b));
Console.WriteLine(This line may or not print);
}
catch (System.DivideByZeroException e)
{
Console.WriteLine(\nDivideByZeroException! Msg: {0}, e.Message);
XLNgoiL
380
NgnNgLpTrnhC#
Console.WriteLine(\nHelpLink: {0}, e.HelpLink);
}
catch (MyCustomException e)
{
Console.WriteLine(\nMyCustomException! Msg: {0}, e.Message);
Console.WriteLine(\nHelpLink: {0}, e.HelpLink);
}
catch
{
Console.WriteLine(Unknown excepiton caught);
}
finally
{
Console.WriteLine(Close file here.);
}
}
// thc hin php chia hp l
public double DoDivide( double a, double b)
{
if ( b == 0)
{
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = http://www.hcmunc.edu.vn;
throw e;
}
if ( a == 0)
{
MyCustomException e = new MyCustomException(Cant have zero
divisor);
e.HelpLink = http://www.hcmuns.edu.vn;
throw e;
}
return a/b;
}
}
}
-----------------------------------------------------------------------------
XLNgoiL
381
NgnNgLpTrnhC#
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 InnerException ca ngoi l
mi cho php truy cp ngoi l ban u.
Bi v InnerException cng 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
{
using System;
// to ngoi l ring
public class MyCustomException : System.Exception
{
public MyCustomException( string message, Exception inner):
base(message, inner)
{
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
XLNgoiL
382
NgnNgLpTrnhC#
t.TestFunc();
}
// chia hai s v x l ngoi l
public void TestFunc()
{
try
{
DangerousFunc1();
}
catch (MyCustomException e)
{
Console.WriteLine(\n{0}, e.Message);
Console.WriteLine(Retrieving exception history...);
Exception inner = e.InnerException;
while ( inner != null)
{
Console.WriteLine({0}, inner.Message);
inner = inner.InnerException;
}
}
}
public void DangerousFunc1()
{
try
{
DangerousFunc2();
}
catch (System.Exception e)
{
MyCustomException ex = new
MyCustomException(E3 Custom Exception Situation, e);
throw ex;
}
}
public void DangerousFunc2()
{
try
{
XLNgoiL
383
NgnNgLpTrnhC#
DangerousFunc3();
}
catch (System.DivideByZeroException e)
{
Exception ex = new Exception(E2 - Func2 caught divide by zero, e);
throw ex;
}
}
public void DangerousFunc3()
{
try
{
DangerousFunc4();
}
catch (System.ArithmeticException)
{
throw;
}
catch (System.Exception)
{
Console.WriteLine(Exception handled here.);
}
}
public void DangerousFunc4()
{
throw new DivideByZeroException(E1 DivideByZero Exception);
}
}
}
-----------------------------------------------------------------------------
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.
XLNgoiL
384
NgnNgLpTrnhC#
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 catch trong hm
DangerousFunc3(). Khi catch trong DangerousFunc3() s bt cc ngoi l Arithmetic-
Exception ( 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 catch ca TestFunc thc hin n s in ra thng ip ca ngoi l :
E3 Custom Exception Situation!
sau tng ngoi l bn trong s c ly ra thng qua vng lp while:
while ( inner != null)
{
XLNgoiL
385
NgnNgLpTrnhC#
Console.WriteLine({0}, inner.Message);
inner = inner.InnerException;
}
Kt qu l chui cc ngoi l c pht sinh v c bt gi:
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 DivideByZero Exception
Cu 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.
Cu hi 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.
Cu hi 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
Cu hi 1: Hy cho bit cc t kha c s dng x l ngoi l?
XLNgoiL
386
NgnNgLpTrnhC#
Cu hi 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?
Cu hi 4: ngha ca t kha finally trong vic x l ngoi l?
Cu hi 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.
Cu hi 7: Nguyn nhn no dn n pht sinh ngoi l?
Cu hi 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.
Cu hi 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:
-----------------------------------------------------------------------------
using System;
public class Tester
{
public static void Main()
{
uint so1=0;
int so2, so3;
so2 = -10;
so3 = 0;
// tnh gi tr li
XLNgoiL
387
NgnNgLpTrnhC#
so1 -= 5;
so2 = 5/so3;
// xut kt qu
Console.WriteLine("So 1: {0}, So 2:{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.
-----------------------------------------------------------------------------
using System;
using System.IO;
public class Tester
{
public static void Main()
{
string fname = "test3.txt";
string buffer;
StreamReader sReader = 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 .
XLNgoiL
388
NgnNgLpTrnhC#
DngVisualStudio.NETXyDngngDngWindowsForm
389

You might also like