Professional Documents
Culture Documents
C# - Tieng Viet PDF
C# - Tieng Viet PDF
LP TRNH C#
Ngn Ng Lp Trnh C#
Mc Lc
1. Microsoft .NET............................................................................................... 10
Tnh hnh trc khi MS.NET ra i........................................................ 10
Ngun gc ca .NET................................................................................12
Microsoft .NET........................................................................................ 12
Tng quan................................................................................................ 12
Kin trc .NET Framework..................................................................... 13
Common Language Runtime................................................................... 15
Th vin .NET Framework......................................................................16
Pht trin ng dng client........................................................................ 16
Bin dch v MSIL...................................................................................17
Ngn ng C#............................................................................................18
2. Ngn ng C#.................................................................................................... 20
Ti sao phi s dng ngn ng C#...........................................................20
C# l ngn ng n gin..........................................................................20
C# l ngn ng hin i........................................................................... 21
C# l ngn ng hng i tng............................................................. 21
C# l ngn ng mnh m......................................................................... 22
C# l ngn ng t t kha.........................................................................22
C# l ngn ng module ha..................................................................... 22
C# s l ngn ng ph bin......................................................................22
Ngn ng C# vi ngn ng khc............................................................. 23
Cc bc chun b cho chng trnh....................................................... 24
Chng trnh C# n gin....................................................................... 25
Pht trin chng trnh minh ha.............................................................31
Cu hi & bi tp..................................................................................... 35
3. Nn tng ngn ng C#.................................................................................. 39
Kiu d liu..............................................................................................40
Kiu d liu xy dng sn....................................................................... 41
Chn kiu d liu.....................................................................................42
Chuyn i kiu d liu........................................................................... 43
Bin v hng............................................................................................ 44
Gn gi tr xc nh cho bin................................................................... 45
Hng.........................................................................................................46
Kiu lit k...............................................................................................47
2
Ngn Ng Lp Trnh C#
6
Ngn Ng Lp Trnh C#
Tham Kho
Quy c
7
Ngn Ng Lp Trnh C#
Chng 1
MICROSOFT .NET
Microsoft .NET
Tng quan
8
Microsoft .NET
Ngn Ng Lp Trnh C#
Trong gii pht trin ng dng trn Windows ta c th vit ng dng bng Visual C++,
Delphi hay Visual Basic, y l mt s cng c ph bin v mnh. Trong Visual C++ l
mt ngn ng rt mnh v cng rt kh s dng. Visual Basic th n gin d hc, d dng
nht nn rt thng dng. L do chnh l Visual Basic gip chng ta c th vit chng trnh
trn Windows d dng m khng cn thit phi bit nhiu v cch thc MS Windows hot
ng, ta ch cn bit mt s kin thc cn bn ti thiu v MS Windows l c th lp trnh
c. Do theo quan im ca Visual Basic nn n lin kt vi Windows l iu t nhin
v d hiu, nhng hn ch l Visual Basic khng phi ngn ng hng i tng (Object
Oriented).
Delphi l hu du ca Turbo Pascal ca Borland. N cng ging v tng i d dng
nh Visual Basic. Delphi l mt ngn ng hng i tng. Cc iu khin dng trn Form
ca Delphi u c t ng khi to m ngun. Tuy nhin, chc nng khi ng m ngun
ny ca Delphi i khi gp rc ri khi c s can thip ca ngi dng vo. Sau ny khi cng
ty Borland b bn v cc chuyn gia xy dng nn Delphi chy qua bn Microsoft, v
Delphi khng cn c pht trin tt na, ngi ta khng dm u t trin khai phn mm
vo Delphi. Cng ty sau ny pht trin dng sn phm Jbuilder (dng Java) khng cn
quan tm n Delphi.
Tuy Visual Basic bn hn do khng cn phi khi to m ngun trong Form khi thit k
nhng Visual Basic cng c nhiu khuyt im :
Khng h tr thit k hng i tng, nht l kh nng tha k (inheritance).
Gii hn v vic chy nhiu tiu trnh trong mt ng dng, v d ta khng th dng
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
9
Microsoft .NET
Ngn Ng Lp Trnh C#
Sau ny gip cho vic lp trnh ASP nhanh hn th cng c Visual InterDev, mt IDE
(Integrated Development Environment) ra i. Visual InterDev to ra cc Design Time
Controls cho vic thit k cc iu khin trn web, Tic thay Visual InterDev khng bn
vng lm nn sau mt thi gian th cc nh pht trin ri b n.
Tm li bn thn ca ASP hy cn mt s khuyt im quan trng, nht l khi chy trn
Internet Information Server vi Windows NT 4, ASP khng ng tin cy lm.
Tm li trong gii lp trnh theo Microsoft th vic lp trnh trn desktop cho n lp trnh
h phn tn hay trn web l khng c nhp nhng cho lm. chuyn c t lp trnh
client hay 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
10
Microsoft .NET
Ngn Ng Lp Trnh C#
dng mt trnh son tho v nh Notepad hay bt c trnh son tho vn bn no v s dng
command line bin dch v thc thi, tuy nhin vic ny mt nhiu thi gian. Tt nht l
chng ta dng IDE pht trin cc ng dng, v cng l cch d s dng nht.
Thnh phn Framework l quan trng nht .NET l ct li v tinh hoa ca mi trng,
cn IDE ch l cng c pht trin da trn nn tng thi. Trong .NET ton b cc ngn
ng C#, Visual C++ hay Visual Basic.NET u dng cng mt IDE.
Tm li Microsoft .NET l nn tng cho vic xy dng v thc thi cc ng dng phn tn
th h k tip. Bao gm cc ng dng t client n server v cc dch v khc. Mt s tnh
nng ca Microsoft .NET cho php nhng nh pht trin s dng nh sau:
Mt m hnh lp trnh cho php nh pht trin xy dng cc ng dng dch v web v
phi su v thuyt phc ngi dng kinh nghim thng qua cc dng thit b.
Nhiu cng c h tr nh Visual Studio .NET, pht trin cc dch v Web XML,
11
Microsoft .NET
Ngn Ng Lp Trnh C#
13
Microsoft .NET
Ngn Ng Lp Trnh C#
ng dng ASP.NET
Dch v Windows
15
Microsoft .NET
Ngn Ng Lp Trnh C#
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
16
Microsoft .NET
Ngn Ng Lp Trnh C#
17
Microsoft .NET
Ngn Ng Lp Trnh C#
Chng 2
NGN NG C#
C# l ngn ng hin i
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
C# l ngn ng hin i
C# l ngn ng mnh m v mm do
18
Ngn Ng C#
Ngn Ng Lp Trnh C#
C# l ngn ng c t t kha
C# l ngn ng hng module
C# s tr nn ph bin
C# l ngn ng n gin
C# loi b mt vi s phc tp v ri rm ca nhng ngn ng nh Java v c++, bao gm
vic loi b nhng macro, nhng template, a k tha, v lp c s o (virtual base class).
Chng l nhng nguyn nhn gy ra s nhm ln hay dn n nhng vn cho cc ngi
pht trin C++. Nu chng ta l ngi hc ngn ng ny u tin th chc chn l ta s khng
tri qua nhng thi gian hc n! Nhng khi ta s khng bit c hiu qu ca ngn
ng C# khi loi b nhng vn trn.
Ngn ng C# n gin v n da trn nn tng C v C++. Nu chng ta thn thin vi C
v C++ hoc thm ch l Java, chng ta s thy C# kh ging v din mo, c php, biu
thc, ton t v nhng chc nng khc c ly trc tip t ngn ng C v C++, nhng n
c ci tin lm cho ngn ng n gin hn. Mt vi trong cc s ci tin l loi b cc
d tha, hay l thm vo nhng c php thay i. V d nh, trong C++ c ba ton t lm
vic vi cc thnh vin l ::, . , v ->. bit khi no dng ba ton t ny cng phc tp v
d nhm ln. Trong C#, chng c thay th vi mt ton t duy nht gi l . (dot). i vi
ngi mi hc th iu ny v nhng vic ci tin khc lm bt nhm ln v n gin hn.
Ghi ch: Nu chng ta s dng Java v tin rng n n gin, th chng ta cng s tm
thy rng C# cng n gin. Hu ht mi ngi u khng tin rng Java l ngn ng n
gin. Tuy nhin, C# th d hn l Java v C++.
C# l ngn ng hin i
iu g lm cho mt ngn ng hin i? Nhng c tnh nh l x l ngoi l, thu gom
b nh t ng, nhng kiu d liu m rng, v bo mt m ngun l nhng c tnh c
mong i trong mt ngn ng hin i. C# cha tt c nhng c tnh trn. Nu l ngi mi
hc lp trnh c th chng ta s cm thy nhng c tnh trn phc tp v kh hiu. Tuy
nhin, cng ng lo lng chng ta s dn dn c tm hiu nhng c tnh qua cc chng
trong cun sch ny.
Ghi ch: Con tr c tch hp vo ngn ng C++. Chng cng l nguyn nhn gy ra
nhng rc ri ca ngn ng ny. C# loi b nhng phc tp v rc ri pht sinh bi con tr.
Trong C#, b thu gom b nh t ng v kiu d liu an ton c tch hp vo ngn ng,
s loi b nhng vn rc ri ca C++.
19
Ngn Ng C#
Ngn Ng Lp Trnh C#
c nhng c tnh trn. Phn hng i tng ca C# s c trnh by chi tit trong mt
chng ring phn sau.
C# l ngn ng t t kha
C# l ngn ng s dng gii hn nhng t kha. Phn ln cc t kha c s dng
m t thng tin. Chng ta c th ngh rng mt ngn ng c nhiu t kha th s mnh hn.
iu ny khng phi s tht, t nht l trong trng hp ngn ng C#, chng ta c th tm
thy rng ngn ng ny c th c s dng lm bt c nhim v no. Bng sau lit k cc
t kha ca ngn ng C#.
C# s l mt ngn ng ph bin
20
Ngn Ng C#
Ngn Ng Lp Trnh C#
21
Ngn Ng C#
Ngn Ng Lp Trnh C#
22
Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
24
Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
25
Ngn Ng C#
Ngn Ng Lp Trnh C#
ng dng Console
V d n gin trn c gi l ng dng console, ng dng ny giao tip vi ngi dng
thng quan bn phm v khng c giao din ngi dng (UI), ging nh cc ng dng thng
thy trong Windows. Trong cc chng xy dng cc ng dng nng cao trn Windows hay
Web th ta mi dng cc cc giao din ha. Cn tm hiu v ngn ng C# thun tu th
cch tt nht l ta vit cc ng dng console.
Trong hai ng dng n gin trn ta dng phng thc WriteLine() ca lp Console.
Phng thc ny s xut ra mn hnh dng lnh hay mn hnh DOS chui tham s a vo,
c th l chui Chao Mung.
Namespace
Nh chng ta bit .NET cung cp mt th vin cc lp s v th vin ny c tn l
FCL (Framework Class Library). Trong Console ch l mt lp nh trong hng ngn lp
trong th vin. Mi lp c mt tn ring, v vy FCL c hng ngn tn nh ArrayList,
Dictionary, FileSelector,
iu ny lm ny sinh vn , ngi lp trnh khng th no nh ht c tn ca cc lp
trong .NET Framework. T hn na l sau ny c th ta to li mt lp trng vi lp c
chng hn. V d trong qu trnh pht trin mt ng dng ta cn xy dng mt lp t in v
ly tn l Dictionary, v iu ny dn n s tranh chp khi bin dch v C# ch cho php mt
tn duy nht.
Chc chn rng khi chng ta phi i tn ca lp t in m ta va to thnh mt ci
tn khc chng hn nh myDictionary. Khi s lm cho vic pht trin cc ng dng tr
nn phc tp, cng knh. n mt s pht trin nht nh no th chnh l cn c mng
cho nh pht trin.
Gii php gii quyt vn ny l vic to ra mt namespace, namsespace s hn ch
phm vi ca mt tn, lm cho tn ny ch c ngha trong vng nh ngha.
Gi s c mt ngi ni Tng l mt k s, t k s phi i km vi mt lnh vc nht nh
no , v nu khng th chng ta s khng bit c l anh ta l k s cu ng, c kh hay
phn mm. Khi mt lp trnh vin C# s bo rng Tng l CauDuong.KySu phn bit vi
CoKhi.KySu hay PhanMem.KySu. Namespace trong trng hp ny l CauDuong, CoKhi,
PhanMem s hn ch phm vi ca nhng t theo sau. N to ra mt vng khng gian tn
sau c ngha.
Tng t nh vy ta c to cc namespace phn thnh cc vng cho cc lp trng tn
khng tranh chp vi nhau.
Tng t nh vy, .NET Framework c xy dng mt lp Dictionary bn trong
namespace System.Collections, v tng ng ta c th to mt lp Dictionary khc nm
trong namespace ProgramCSharp.DataStructures, iu ny hon ton khng dn n s
tranh chp vi nhau.
26
Ngn Ng C#
Ngn Ng Lp Trnh C#
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);
}
}
-----------------------------------------------------------------------------
27
Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
28
Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
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.
29
Ngn Ng C#
Ngn Ng Lp Trnh C#
u tin chng ta s m chng trnh Notepad ri son tho chng trnh minh ha trn,
lu l ta c th s dng bt c trnh son tho vn bn no ch khng nht thit l Notepad.
Sau khi son tho xong th lu tp tin xung a v tp tin ny c phn m rng l *.cs, trong
v d ny l chaomung.cs. Bc tip theo l bin dch tp tin ngun va to ra. bin dch
ta dng trnh bin dch dng lnh C# (csc.exe) chng trnh ny c chp vo my trong qu
trnh ci .NET Framework. bit csc.exe nm chnh xc v tr no trong a ta c th dng
chc nng tm kim ca Windows.
thc hin bin dch chng ta m mt ca s dng lnh ri nh vo lnh theo mu sau:
csc.exe [/out: <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.
30
Ngn Ng C#
Ngn Ng Lp Trnh C#
31
Ngn Ng C#
Ngn Ng Lp Trnh C#
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?
33
Ngn Ng C#
Ngn Ng Lp Trnh C#
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?
34
Ngn Ng C#
Ngn Ng Lp Trnh C#
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
35
Ngn Ng C#
Ngn Ng Lp Trnh C#
{
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:
36
Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
37
Ngn Ng C#
Ngn Ng Lp Trnh C#
Chng 3
NN TNG NGN NG C#
Kiu d liu
Kiu d liu xy dng sn
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
Cu lnh lp
Ton t
Namespace
Cc ch dn bin dch
Cu hi & bi tp
38
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Trong chng trc chng ta tm hiu mt chng trnh C# n gin nht. Chng
trnh cha din t mt chng trnh vit bng ngn ng C#, c qu nhiu phn v
chi tit b qua. Do vy trong chng ny chng ta s i su vo tm hiu cu trc v c
php ca ngn ng C#.
Chng ny s tho lun v h thng kiu d liu, phn bit gia kiu d liu xy dng
sn (nh int, bool, string) vi kiu d liu do ngi dng nh ngha (lp hay cu trc do
ngi lp trnh to ra...). Mt s c bn khc v lp trnh nh to v s dng bin d liu hay
hng cng c cp cng vi cu trc lit k, chui, nh danh, biu thc v cu lnh.
Trong phn hai ca chng hng dn v minh ha vic s dng lnh phn nhnh if,
switch, while, do...while, for, v foreach. V cc ton t nh php gn, php ton logic,
php ton quan h, v ton hc...
Nh chng ta bit C# l mt ngn ng hng i tng rt mnh, v cng vic ca
ngi lp trnh l k tha to v khai thc cc i tng. Do vy nm vng v pht trin
tt ngi lp trnh cn phi i t nhng bc i du tin tc l i vo tm hiu nhng phn c
bn v ct li nht ca ngn ng.
Kiu d liu
C# l ngn ng lp trnh mnh v kiu d liu, mt ngn ng mnh v kiu d liu l phi
khai bo kiu ca mi i tng khi to (kiu s nguyn, s thc, kiu chui, kiu iu
khin...) v trnh bin dch s gip cho ngi lp trnh khng b li khi ch cho php mt loi
kiu d liu c th c gn cho cc kiu d liu khc. Kiu d liu ca mt i tng l mt
tn hiu trnh bin dch nhn bit kch thc ca mt i tng (kiu 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.
39
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Ngoi ra C# cng h tr mt kiu con tr C++, nhng him khi c s dng, v ch khi no
lm vic vi nhng on m lnh khng c qun l (unmanaged code). M lnh khng
c qun l l cc lnh c vit bn ngoi nn .MS.NET, nh l cc i tng COM.
40
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Stack v Heap
41
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
K t ngha
\ Du nhy n
\ Du nhy kp
\\ Du cho
\0 K t null
\a Alert
42
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
\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.
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.
-----------------------------------------------------------------------------
43
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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
44
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Vic s dng bin khi cha c khi to l khng hp l trong C#. V d 3.2 trn khng hp
l.
Tuy nhin khng nht thit lc no chng ta cng phi khi to bin. Nhng dng c th
bt buc phi gn cho chng mt gi tr trc khi c mt lnh no tham chiu n bin .
iu ny c gi l gn gi tr xc nh cho bin v C# bt buc phi thc hin iu ny.
V d 3.3 minh ha mt chng trnh ng.
V d 3.3: Bin khng c khi to nhng sau c gn gi tr.
-----------------------------------------------------------------------------
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>;
45
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Mt biu tng hng phi c khi to khi khai bo, v ch khi to duy nht mt ln trong
sut chng trnh v khng c thay i. V d:
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 );
46
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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:
47
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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:
48
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Nhiet do dong: 0
Nhiet do nguoi: 20
Nhiet do am: 40
Nhiet do nong: 60
Nhiet do soi: 100
-----------------------------------------------------------------------------
Mi thnh phn trong kiu lit k tng ng vi mt gi tr s, trong trng hp ny l mt
s nguyn. Nu chng ta khng khi to cho cc thnh phn ny th chng s nhn cc gi tr
tip theo vi thnh phn u tin l 0.
Ta xem th khai bo sau:
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.
49
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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;
50
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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#.
51
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Khi trnh bin dch x l n tn ca mt hm, th s ngng thc hin hm hin thi m bt
u phn nhnh d to mt gi hm mi. Sau khi hm va to thc hin xong v tr v mt
gi tr th trnh bin dch s tip tc thc hin dng lnh tip sau ca hm ban u. v d 3.6
minh ha cho vic phn nhnh khi gi hm.
V d 3.6: Gi mt hm.
-----------------------------------------------------------------------------
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.
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.
52
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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)
53
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
{
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
54
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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
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
55
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
56
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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:
57
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
59
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
...
break;
...
}
Cu lnh lp
C# cung cp mt b m rng cc cu lnh lp, bao gm cc cu lnh lp for, while v
do... while. Ngoi ra ngn ng C# cn b sung thm mt cu lnh lp foreach, lnh ny
mi i vi ngi lp trnh C/C++ nhng kh thn thin vi ngi lp trnh VB. Cui cng l
cc cu lnh nhy nh goto, break, continue, v return.
Cu lnh nhy goto
Lnh nhy 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;
}
}
-----------------------------------------------------------------------------
60
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Kt qu:
i:0
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9
-----------------------------------------------------------------------------
Nu chng ta v lu ca mt chng trnh c s dng nhiu lnh goto, th ta s thy kt
qu rt nhiu ng chng cho ln nhau, ging nh l cc si m vy. Chnh v vy nn
nhng on m chng trnh c dng lnh goto cn c gi l spaghetti code.
Vic trnh dng lnh nhy goto trong chng trnh hon ton thc hin c, c th dng
vng lp while thay th hon ton cc cu lnh goto.
Vng lp while
ngha ca vng lp 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++;
61
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
}
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.
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.
62
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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.
Vng lp for
63
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
{
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++)
{
64
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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;
}
}
-----------------------------------------------------------------------------
Cu lnh lp foreach
65
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
}
-----------------------------------------------------------------------------
Kt qu:
1 2 3 4 5 6 7 8 9 10
-----------------------------------------------------------------------------
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)
66
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
{
//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!
67
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Ton t
Ton t c k hiu bng mt biu tng dng thc hin mt hnh ng. Cc kiu
d liu c bn ca C# nh kiu nguyn h tr rt nhiu cc ton t nh ton t gn, ton t
ton hc, logic....
Ton t gn
n lc ny ton t gn kh quen thuc vi chng ta, hu ht cc chng trnh minh
ha t u sch u s dng php gn. Ton t gn hay php gn lm cho ton hng bn
tri thay i gi tr bng vi gi tr ca ton hng bn phi. Ton t gn l ton t hai ngi.
y l ton t n gin nht thng dng nht v cng d s dng nht.
Ton t ton hc
Ngn ng C# cung cp nm ton t ton hc, bao gm bn ton t u cc php ton
c bn. Ton t cui cng l ton t chia nguyn ly phn d. Chng ta s tm hiu chi tit
cc php ton ny trong phn tip sau.
Cc php ton s hc c bn (+,-,*,/)
68
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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
69
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Modulus: 1
-----------------------------------------------------------------------------
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:
70
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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++;
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;
71
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
Ton t logic
72
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
73
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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#.
74
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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;
75
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
-----------------------------------------------------------------------------
76
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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;
}
}
77
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
}
}
-----------------------------------------------------------------------------
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
78
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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
79
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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.
80
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
#ifu 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
81
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
thc thi khi TEST c nh ngha. Cui cng nu c hai DEBUG v TEST u khng c
nh ngha th cc on m ngun gia #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?
82
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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?
-----------------------------------------------------------------------------
83
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
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);
}
}
84
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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)
85
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210
Bi tp 7: Vit chng trnh in k t s (0..9) v k t ch (a..z) vi m k t tng ng ca
tng k t
V d:
0 : 48
1 : 49
....
Bi tp 8: Vit chng trnh gii phng trnh bc nht, cho php ngi dng nhp vo gi
tr a, b.
Bi 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.
86
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Chng 4
XY DNG LP - I TNG
nh ngha lp
Thuc tnh truy cp
To i tng
B khi dng
T kha this
Hy i tng
Truyn tham s
Np chng phng thc
ng gi d liu vi thnh phn thuc tnh
Thuc tnh ch c
Cu hi & bi tp
Chng 3 tho lun rt nhiu kiu d liu c bn ca ngn ng C#, nh int, long and
char. Tuy nhin tri tim v linh hn ca C# l kh nng to ra nhng kiu d liu mi, phc
87
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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]
{
88
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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();
}
}
90
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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();
91
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
92
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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();
93
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
94
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
96
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
97
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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
98
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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:
S dng khi cc bin thnh vin b che lp bi tham s a vo, nh trng hp sau:
99
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
}
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.
S dng tham chiu this truyn i tng hin hnh vo mt tham s ca mt phng
100
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
101
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
102
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
103
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
104
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
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();
}
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
{
106
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
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;
108
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
}
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.
109
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
110
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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)
111
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
{
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
112
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
113
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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;
}
114
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
115
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
}
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.
116
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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;
117
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
118
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
}
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;
119
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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()
120
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
{
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?
121
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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?
122
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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?
-----------------------------------------------------------------------------
123
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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.
124
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
Chng 5
K THA A HNH
Gi phng thc ca lp c s
a hnh
Kiu a hnh
Lp tru tng
Gc ca tt c cc lp - lp Object
Cc lp lng nhau
Cu hi & bi tp
Trong chng trc trnh by cch to ra nhng kiu d liu mi bng vic xy
dng cc lp i tng. Tip theo chng ny s a chng ta i su vo mi quan h gia
nhng i tng trong th gii thc v cch m hnh ha nhng quan h trong xy dng
chng trnh. Chng 5 cng gii thiu khi nim c bit ha (specialization) c ci t
trong ngn ng C# thng qua s k tha (inheritance).
125
K Tha a Hnh
Ngn Ng Lp Trnh C#
NG
VT
C V
MO CH
126
K Tha a Hnh
Ngn Ng Lp Trnh C#
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.
Window
Window
127
K Tha a Hnh
Radio Check Box Command List Box
Button
Ngn Ng Lp Trnh C#
Window
Radio
Button
128
K Tha a Hnh
Ngn Ng Lp Trnh C#
S thit k trn khng phi l duy nht hay cch tt nht t chc nhng i tng,
nhng l khi im hiu v cch quan h gia i tng vi cc i tng khc.
S k tha
Trong ngn ng C#, quan h c bit ha c thc thi bng cch s dng s k tha.
y khng phi l cch duy nht thc thi c bit ha, nhng n l cch chung nht v t
nhin nht thc thi quan h ny.
Trong m hnh trc, ta c th ni ListBox k tha hay c dn xut t Window.
Window c xem nh l lp c s, v ListBox c xem nh l lp dn xut. Nh vy,
ListBox dn xut tt c cc thuc tnh v hnh vi t lp Window v thm nhng phn c bit
ring xc nhn ListBox.
129
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
// 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();
}
130
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
-----------------------------------------------------------------------------
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.
131
K Tha a Hnh
Ngn Ng Lp Trnh C#
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.
132
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
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.
133
K Tha a Hnh
Ngn Ng Lp Trnh C#
134
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
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
135
K Tha a Hnh
Ngn Ng Lp Trnh C#
136
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
-----------------------------------------------------------------------------
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.
137
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
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( ) {}
138
K Tha a Hnh
Ngn Ng Lp Trnh C#
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)
{
139
K Tha a Hnh
Ngn Ng Lp Trnh C#
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);
}
140
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
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
141
K Tha a Hnh
Ngn Ng Lp Trnh C#
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
142
K Tha a Hnh
Ngn Ng Lp Trnh C#
143
K Tha a Hnh
Ngn Ng Lp Trnh C#
144
K Tha a Hnh
Ngn Ng Lp Trnh C#
Stack Heap
123
int i = 123;
i boxed
o
123 Int
123
object o=i;
145
K Tha a Hnh
Ngn Ng Lp Trnh C#
Stack Heap
i
123
int i = 123;
i boxed
o
123 Int
123
object o=i;
k
123
int k = (int)o;
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);
146
K Tha a Hnh
Ngn Ng Lp Trnh C#
}
}
-----------------------------------------------------------------------------
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;
147
K Tha a Hnh
Ngn Ng Lp Trnh C#
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?
149
K Tha a Hnh
Ngn Ng Lp Trnh C#
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;
}
150
K Tha a Hnh
Ngn Ng Lp Trnh C#
151
K Tha a Hnh
Ngn Ng Lp Trnh C#
{
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();
}
}
}
-----------------------------------------------------------------------------
152
K Tha a Hnh
Ngn Ng Lp Trnh C#
Chng 6
NP CHNG TON T
153
Np Chng Ton T
Ngn Ng Lp Trnh C#
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
154
Np Chng Ton T
Ngn Ng Lp Trnh C#
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.
156
Np Chng Ton T
Ngn Ng Lp Trnh C#
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.
157
Np Chng Ton T
Ngn Ng Lp Trnh C#
158
Np Chng Ton T
Ngn Ng Lp Trnh C#
159
Np Chng Ton T
Ngn Ng Lp Trnh C#
Fraction f3 = f1 + f2;
Console.WriteLine("f1 + f2 = f3:{0}",f3.ToString());
Fraction f4 = f3 + 5;
Console.WriteLine("f4 = f3 + 5:{0}",f4.ToString());
160
Np Chng Ton T
Ngn Ng Lp Trnh C#
}
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 *
161
Np Chng Ton T
Ngn Ng Lp Trnh C#
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());
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
163
Np Chng Ton T
Ngn Ng Lp Trnh C#
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.
164
Np Chng Ton T
Ngn Ng Lp Trnh C#
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
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]
165
Cu Trc
Ngn Ng Lp Trnh C#
}
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;
}
}
166
Cu Trc
Ngn Ng Lp Trnh C#
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 );
168
Cu Trc
Ngn Ng Lp Trnh C#
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.
169
Cu Trc
Ngn Ng Lp Trnh C#
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.
170
Cu Trc
Ngn Ng Lp Trnh C#
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;
171
Cu Trc
Ngn Ng Lp Trnh C#
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
172
Cu Trc
Ngn Ng Lp Trnh C#
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
{
173
Cu Trc
Ngn Ng Lp Trnh C#
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)
{
174
Cu Trc
Ngn Ng Lp Trnh C#
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.
175
Cu Trc
Ngn Ng Lp Trnh C#
Chng 8
Kt hp cc giao din
Ton t is
Ton t as
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.
176
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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.
177
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
178
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
// 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;
179
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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.
180
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
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
181
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
{
182
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
183
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
// 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();
184
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
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);
}
}
185
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
-----------------------------------------------------------------------------
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
186
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
isc.LogSaveBytes(); // ILoggedCompressible
isc.Compress(); // ICompress
isc.Read(); // IStorable
}
187
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
188
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
189
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
{
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
190
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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);
}
191
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
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.
192
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
193
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
}
// 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);
194
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
195
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
{
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
196
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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!
197
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
198
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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();
}
}
-----------------------------------------------------------------------------
199
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
Kt qu:
Creating document with: Test Document
Implementing IStorable.Read
Implementing ITalk.Read
Implementing IStorable.Read
Implementing ITalk.Talk
-----------------------------------------------------------------------------
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
200
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
{
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() {...}
}
201
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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;
}
}
202
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
203
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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:
204
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
// 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:
205
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
206
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
(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.
207
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
{
208
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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
209
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
{
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);
}
}
-----------------------------------------------------------------------------
210
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
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.
211
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
Chng 9
MNG, CH MC, V TP HP
Mng
Khai bo mng
Gi tr mc nh
Cu lnh lp foreach
Mng a chiu
Mng a chiu cng kch thc
Chuyn i mng
System.Array
B ch mc
B ch mc v php gn
Giao din tp hp
Cu hi & bi tp
212
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
.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
213
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
214
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
215
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
216
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
// 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.
217
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
218
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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;
}
219
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
221
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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]);
}
}
}
}
}
222
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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.
-----------------------------------------------------------------------------
223
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
224
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
225
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
226
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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:
227
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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;
}
228
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
229
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
230
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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 );
}
}
}
-----------------------------------------------------------------------------
231
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
232
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
233
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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;
234
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
// 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);
235
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
236
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
237
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
238
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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)
239
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
{
// 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
240
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
241
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
242
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
243
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
{
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;
}
244
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
245
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
{
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++;
246
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
}
}
}
-----------------------------------------------------------------------------
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.
247
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
249
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
250
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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);
}
}
}
251
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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.
252
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
253
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
{
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());
}
254
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
255
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
257
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
258
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
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;
259
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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
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.
261
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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);
262
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
263
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
264
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
// 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 );
265
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
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
266
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
267
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
269
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
}
}
-----------------------------------------------------------------------------
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)
{
270
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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,...
271
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
// 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?
272
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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?
273
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
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.
274
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
275
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Chng 10
X L CHUI
Lp i tng string
To mt chui
Tm mt chui con
Chia chui
S dng Regex tm tp hp
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
276
X L Chui
Ngn Ng Lp Trnh C#
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
277
X L Chui
Ngn Ng Lp Trnh C#
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.
278
X L Chui
Ngn Ng Lp Trnh C#
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.
279
X L Chui
Ngn Ng Lp Trnh C#
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
280
X L Chui
Ngn Ng Lp Trnh C#
281
X L Chui
Ngn Ng Lp Trnh C#
// 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;
282
X L Chui
Ngn Ng Lp Trnh C#
284
X L Chui
Ngn Ng Lp Trnh C#
Tm mt chui con
285
X L Chui
Ngn Ng Lp Trnh C#
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
286
X L Chui
Ngn Ng Lp Trnh C#
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()
287
X L Chui
Ngn Ng Lp Trnh C#
{
// 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
288
X L Chui
Ngn Ng Lp Trnh C#
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.
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
289
X L Chui
Ngn Ng Lp Trnh C#
290
X L Chui
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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
291
X L Chui
Ngn Ng Lp Trnh C#
292
X L Chui
Ngn Ng Lp Trnh C#
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,
294
X L Chui
Ngn Ng Lp Trnh C#
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.
295
X L Chui
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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.
296
X L Chui
Ngn Ng Lp Trnh C#
297
X L Chui
Ngn Ng Lp Trnh C#
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.
299
X L Chui
Ngn Ng Lp Trnh C#
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
300
X L Chui
Ngn Ng Lp Trnh C#
{
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
301
X L Chui
Ngn Ng Lp Trnh C#
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?
302
X L Chui
Ngn Ng Lp Trnh C#
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.
303
X L Chui
Ngn Ng Lp Trnh C#
Chng 11
C CH Y QUYN - S KIN
y quyn
S dng y quyn xc nhn phng thc lc thc thi
y quyn tnh
Muticasting
S kin
C ch publishing subscribing
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
304
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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.
305
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
306
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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)
{
307
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
310
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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
311
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
312
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
313
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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
314
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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},
315
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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
316
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
317
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
318
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
319
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
{
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
{
320
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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.
321
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
322
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
323
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
324
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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.
325
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
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:
326
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
327
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
328
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
}
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());
329
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
}
}
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
330
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
{
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
331
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
// 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
332
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
{
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();
}
}
}
333
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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 ?
334
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh 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.
335
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Chng 12
CC LP C S .NET
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
338
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
339
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
340
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
341
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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.
342
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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 xy
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
343
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
344
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
345
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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).
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
346
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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()
347
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
{
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);
}
}
}
}
-----------------------------------------------------------------------------
348
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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:
349
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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.
-----------------------------------------------------------------------------
// 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)
{
351
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
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++)
{
354
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
355
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
Data to
be written
Disk file
arg[0]
myFile - StreamWriter
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
{
356
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
357
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
358
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
}
}
}
-----------------------------------------------------------------------------
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);
359
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
}
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.
360
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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.
361
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
363
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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.
364
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
Chng 13
X L NGOI L
Cu lnh catch
Cu lnh finally
iu ny c ngha rng nu chc nng hot ng hin hnh khng thc hin vic x l
ngoi l, th chc nng ny s b chm dt v hm gi s nhn s thay i n vic x l
ngoi l. Nu hm gi ny khng thc hin vic x l ngoi l, ngoi l s c x l sm
bi CLR, iu ny dn n chng trnh ca chng ta s kt thc.
Mt trnh x l ngoi l l mt khi lnh chng trnh c thit k x l cc ngoi l m
chng trnh pht sinh. X l ngoi l c thc thi trong trong cu lnh catch. Mt cch l
tng th nu mt ngoi l c bt v c x l, th chng trnh c th sa cha c vn
v tip tc thc hin hot ng. Thm ch nu chng trnh khng tip tc, bng vic bt
gi ngoi l chng ta c c hi in ra nhng thng ip c ngha v kt thc chng trnh
mt cch r rng.
Nu on chng trnh ca chng ta thc hin m khng quan tm n bt c ngoi l
no m chng ta c th gp (nh khi gii phng ti nguyn m chng trnh c cp pht),
chng ta c th t on m ny trong khi finally, khi n s chc chn s c thc hin
thm ch ngay c khi c mt ngoi l xut hin.
Cu lnh throw
pht tn hiu mt s khng bnh thng trong mt lp ca ngn ng C#, chng ta pht
sinh mt ngoi l. lm c iu ny, chng ta s dng t kha throw. Dng lnh sau to
ra mt th hin mi ca System.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
{
366
X L Ngoi L
Ngn Ng Lp Trnh C#
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...);
}
368
X L Ngoi L
Ngn Ng Lp Trnh C#
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?
369
X L Ngoi L
Ngn Ng Lp Trnh C#
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...);
370
X L Ngoi L
Ngn Ng Lp Trnh C#
}
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
371
X L Ngoi L
Ngn Ng Lp Trnh C#
{
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;
}
}
372
X L Ngoi L
Ngn Ng Lp Trnh C#
}
-----------------------------------------------------------------------------
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.
373
X L Ngoi L
Ngn Ng Lp Trnh C#
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
374
X L Ngoi L
Ngn Ng Lp Trnh C#
{
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
375
X L Ngoi L
Ngn Ng Lp Trnh C#
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.
376
X L Ngoi L
Ngn Ng Lp Trnh C#
377
X L Ngoi L
Ngn Ng Lp Trnh C#
-----------------------------------------------------------------------------
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)
378
X L Ngoi L
Ngn Ng Lp Trnh C#
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
379
X L Ngoi L
Ngn Ng Lp Trnh C#
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);
380
X L Ngoi L
Ngn Ng Lp Trnh C#
381
X L Ngoi L
Ngn Ng Lp Trnh C#
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
382
X L Ngoi L
Ngn Ng Lp Trnh C#
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
{
383
X L Ngoi L
Ngn Ng Lp Trnh C#
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.
384
X L Ngoi L
Ngn Ng Lp Trnh C#
385
X L Ngoi L
Ngn Ng Lp Trnh C#
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?
386
X L Ngoi L
Ngn Ng Lp Trnh C#
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
387
X L Ngoi L
Ngn Ng Lp Trnh C#
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 .
388
X L Ngoi L
Ngn Ng Lp Trnh C#
389
Dng Visual Studio .NET Xy Dng ng Dng Windows Form