Professional Documents
Culture Documents
Ngon Ngu Lap Trinh C# PDF
Ngon Ngu Lap Trinh C# 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
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
Bin v hng............................................................................................ 44
Gn gi tr xc nh cho bin................................................................... 45
Hng.........................................................................................................46
Kiu lit k...............................................................................................47
2
Ngn Ng Lp Trnh C#
Biu thc.................................................................................................. 50
Khong trng............................................................................................51
Cu lnh................................................................................................... 51
Phn nhnh khng c iu kin............................................................... 52
Phn nhnh c iu kin.......................................................................... 53
Cu lnh lp............................................................................................. 60
Ton t..................................................................................................... 68
Namespace............................................................................................... 76
Cc ch dn bin dch............................................................................... 80
Cu hi & bi tp..................................................................................... 82
4. Xy dng lp - i tng............................................................................87
nh ngha lp......................................................................................... 88
Thuc tnh truy cp.................................................................................. 91
Tham s ca phng thc........................................................................92
To i tng...........................................................................................93
B khi dng............................................................................................93
Khi to bin thnh vin..........................................................................96
B khi dng sao chp.............................................................................98
T kha this............................................................................................. 99
Hy i tng.......................................................................................... 104
Truyn tham s.........................................................................................107
Np chng phng thc...........................................................................112
ng gi d liu vi thuc tnh............................................................... 116
Thuc tnh ch c................................................................................... 119
Cu hi & bi tp..................................................................................... 121
Ngn Ng Lp Trnh C#
a hnh.....................................................................................................133
Kiu a hnh.............................................................................................133
Phng thc a hnh................................................................................ 133
T kha new v override......................................................................... 137
7. Cu trc............................................................................................................. 165
nh ngha mt cu trc...........................................................................165
To cu trc..............................................................................................168
Cu trc l mt kiu gi tr...................................................................... 168
Gi b khi dng mc nh..................................................................... 169
To cu trc khng gi new.....................................................................170
Ngn Ng Lp Trnh C#
B ch mc............................................................................................... 232
B ch mc v php gn...........................................................................236
S dng kiu ch s khc......................................................................... 237
Ngn Ng Lp Trnh C#
S kin..................................................................................................... 324
C ch publishing- subscribing................................................................324
S kin v y quyn................................................................................. 325
12. Cc lp c s .NET......................................................................................335
Lp i tng trong .NET Framework.................................................... 335
Lp Timer................................................................................................ 337
Lp v th mc v h thng.................................................................... 340
Lp Math..................................................................................................342
Lp thao tc tp tin.................................................................................. 345
Lm vic vi tp tin d liu..................................................................... 351
Cu hi & bi tp..................................................................................... 362
Ngn Ng Lp Trnh C#
Tham Kho
Gio trnh Ngn ng Lp trnh C# c bin dch v tng hp t:
Programming C#, Jesse Liberty, OReilly.
C# in 21 Days, Bradley L.Jones, SAMS.
Windows Forms Programming with C#, Erik Brown, Manning.
MSDN Library April 2002.
Quy c
Gio trnh s dng mt s quy c nh sau:
Cc thut ng c gii thiu ln u tin s in nghing.
M ngun ca chng trnh minh ha dng font Verdana -10.
Cc t kha ca C# dng font Verdana-10, m hoc Verdana-10, bnh thng.
Tn namspace, lp, i tng, phng thc, thuc tnh, s kin... dng font Verdana10.
Kt qu ca chng trnh xut ra mn hnh console dng font Courier New-10.
Ngn Ng Lp Trnh C#
Chng 1
MICROSOFT .NET
Tnh hnh trc khi MS.NET ra i
Ngun gc ca .NET
Microsoft .NET
Tng quan
Ngn Ng Lp Trnh C#
Trong gii pht trin ng dng trn Windows ta c th vit ng dng bng Visual C++,
Delphi hay Visual Basic, y l mt s cng c ph bin v mnh. Trong Visual C++ l
mt ngn ng rt mnh v cng rt kh s dng. Visual Basic th n gin d hc, d dng
nht nn rt thng dng. L do chnh l Visual Basic gip chng ta c th vit chng trnh
trn Windows d dng m khng cn thit phi bit nhiu v cch thc MS Windows hot
ng, ta ch cn bit mt s kin thc cn bn ti thiu v MS Windows l c th lp trnh
c. Do theo quan im ca Visual Basic nn n lin kt vi Windows l iu t nhin
v d hiu, nhng hn ch l Visual Basic khng phi ngn ng hng i tng (Object
Oriented).
Delphi l hu du ca Turbo Pascal ca Borland. N cng ging v tng i d dng
nh Visual Basic. Delphi l mt ngn ng hng i tng. Cc iu khin dng trn Form
ca Delphi u c t ng khi to m ngun. Tuy nhin, chc nng khi ng m ngun
ny ca Delphi i khi gp rc ri khi c s can thip ca ngi dng vo. Sau ny khi cng
ty Borland b bn v cc chuyn gia xy dng nn Delphi chy qua bn Microsoft, v
Delphi khng cn c pht trin tt na, ngi ta khng dm u t trin khai phn mm
vo Delphi. Cng ty sau ny pht trin dng sn phm Jbuilder (dng Java) khng cn
quan tm n Delphi.
Tuy Visual Basic bn hn do khng cn phi khi to m ngun trong Form khi thit k
nhng Visual Basic cng c nhiu khuyt im :
Khng h tr thit k hng i tng, nht l kh nng tha k (inheritance).
Gii hn v vic chy nhiu tiu trnh trong mt ng dng, v d ta khng th dng
Visual Basic vit mt Service kiu NT.
Kh nng x l li rt yu, khng thch hp trong mi trng Multi- tier
Kh dng chung vi ngn ng khc nh C++.
Khng c User Interface thch hp cho Internet.
Do Visual Basic khng thch hp cho vit cc ng Web Server nn Microsoft to ra ASP
(Active Server Page). Cc trang ASP ny va c tag HTML va cha cc on script
(VBScript, JavaScript) nm ln ln nhau. Khi x l mt trang ASP, nu l tag HTML th s
c gi thng qua Browser, cn cc script th s c chuyn thnh cc dng HTML ri gi
i, ngoi tr cc function hay cc sub trong ASP th v tr cc script khc rt quan trng.
Khi mt s chc nng no c vit tt ngi ta dch thnh ActiveX v a n vo Web
Server. Tuy nhin v l do bo mt nn cc ISP (Internet Service Provider) lm my ch cho
Web site thng rt d t khi ci ActiveX l trn my ca h. Ngoi ra vic tho g cc
phin bn ca ActiveX ny l cng vic rt kh, thng xuyn lm cho 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
ng dng client vi Extensible Markup Language (XML).
Tp hp dch v XML Web, nh Microsoft .NET My Services cho php nh pht
trin n gin v tch hp ngi dng kinh nghim.
Cung cp cc server phc v bao gm: Windows 2000, SQL Server, v BizTalk
Server, tt c iu tch hp, hot ng, v qun l cc dch v XML Web v cc ng
dng.
Cc phn mm client nh Windows XP v Windows CE gip ngi pht trin phn
phi su v thuyt phc ngi dng kinh nghim thng qua cc dng thit b.
Nhiu cng c h tr nh Visual Studio .NET, pht trin cc dch v Web XML,
ng dng trn nn Windows hay nn web mt cch d dng v hiu qu.
Ngn Ng Lp Trnh C#
Ngn Ng Lp Trnh C#
13
Microsoft .NET
Ngn Ng Lp Trnh C#
Ngn Ng Lp Trnh C#
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#
Ti sao phi s dng ngn ng C#
C# l ngn ng n gin
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
Cu hi & bi tp
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#.
abstract
default
foreach
object
sizeof
unsafe
as
delegate
goto
operator
stackalloc
ushort
base
do
if
out
static
using
bool
double
implicit
override
string
virtual
break
else
in
params
struct
volatile
byte
enum
int
private
switch
void
case
event
interface
protected
this
while
catch
explicit
internal
public
throw
char
extern
is
readonly
true
checked
false
lock
ref
try
class
finally
long
return
typeof
const
fixed
namespace
sbyte
uint
continue
float
new
sealed
ulong
decimal
for
null
short
unchecked
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#
---------------------------------------------------------------------------- Kt qu:
Chao Mung
----------------------------------------------------------------------------Sau khi vit xong chng ta lu di dng tp tin c phn m rng *.cs (C sharp). Sau
bin dch v chy chng trnh. Kt qu l mt chui Chao Mung s xut hin trong mn
hnh console.
Cc mc sau s gii thiu xoay quanh v d 2.1, cn phn chi tit tng loi s c trnh
by trong cc chng k tip.
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
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
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()
{
.......
}
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>
30
Ngn Ng C#
Ngn Ng Lp Trnh C#
31
Ngn Ng C#
Ngn Ng Lp Trnh C#
Ngn Ng Lp Trnh C#
Sau tt c cng vic , tip theo l phn bin dch chng trnh t Visual Studio .NET.
Thng thng thc hin mt cng vic no ta c th chn kch hot chc nng trong
menu, hay cc button trn thanh toolbar, v cch nhanh nht l s dng cc phm nng hay
cc phm kt hp gi nhanh mt chc nng.
Trong v d, bin dch chng trnh nhn Ctrl-Shift-B hoc chn chc nng:
Build Build Solution. Mt cch khc na l dng nt lnh trn thanh toolbar:
chy chng trnh va c to ra m khng s dng ch debug chng ta c th nhn
Ctrl-F5 hay chn Debug Start Without Debugging hoc nt lnh
trn thanh toolbar
ca Visual Studio . NET
Ghi ch: Tt hn ht l chng ta nn b ra nhiu thi gian tm hiu hay khm ph mi
trng pht trin Visual Studio .NET. y cng l cch thc tt m nhng ngi pht trin
ng dng v chng ta nn thc hin. Vic tm hiu Visual Studio .NET v thng tho n s
gip cho chng ta rt nhiu trong qu trnh xy dng v pht trin ng dng sau ny.
Cu hi v tr li
Cu hi 1: Mt chng trnh C# c th chy trn bt c my no?
Tr li 1: Khng phi tt c. Mt chng trnh C# ch chy trn my c Common Language
Runtime (CLR) c ci t. Nu chng ta copy mt chng trnh exe ca C# qua mt my
khng c CLR th chng ta s nhn c mt li. Trong nhng phin bn ca Windows
khng c CLR chng ta s c bo rng thiu tp tin DLL.
Cu hi 2: Nu mun a chng trnh m ta vit cho mt ngi bn th tp tin no m
chng ta cn a?
Tr li 2: Thng thng cch tt nht l a chng trnh bin dch. iu ny c ngha
rng sau khi m ngun c bin dch, chng ta s c mt chng trnh thc thi (tp tin c
phn m rng *.exe ). Nh vy, nu chng ta mun a chng trnh Chaomung cho tt c
nhng ngi bn ca chng ta th ch cn a tp tin Chaomung.exe. Khng cn thit phi
a tp tin ngun Chaomung.cs. V nhng ngi bn ca chng ta khng cn thit phi c
trnh bin dch C#. H ch cn c C# runtime trn my tnh (nh CLR ca Microsoft) l c
th chy c chng trnh ca chng ta.
Cu hi 3: Sau khi to ra c tp tin thc thi .exe. C cn thit gi li tp tin ngun khng?
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));
}
}
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
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
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.
S byte
1
Kiu .NET
Byte
2
1
Char
1
2
Sbyte
2
4
Unt16
Uint32
float
4
4
double
Double
decimal
Decimal
char
bool
sbyte
short
ushort
int
uint
Boolean
Int16
Int32
Single
M t
S nguyn dng khng du t 0-255
K t Unicode
Gi tr logic true/ false
S nguyn c du ( t -128 n 127)
S nguyn c du gi tr t -32768 n
32767.
S nguyn khng du 0 65.535
S nguyn c du 2.147.483.647 v
2.147.483.647
S nguyn khng du 0 4.294.967.295
Kiu du chm ng, gi tr xp x t 3,4E38 n 3,4E+38, vi 7 ch s c ngha..
Kiu du chm ng c chnh xc gp
i, gi tr xp x t 1,7E-308 n 1,7E+308,
vi 15,16 ch s c ngha.
C chnh xc n 28 con s v gi tr thp
phn, c dng trong tnh ton ti chnh,
kiu ny i hi phi c hu t m hay M
theo sau gi tr.
40
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
long
ulong
Int64
S nguyn khng du t 0 n
0xffffffffffffffff
Bng 3.1 : M t cc kiu d liu xy dng sn.
Uint64
41
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
Cch tt nht khi s dng bin khng du l gi tr ca bin lun lun dng, bin ny
thng th hin mt thuc tnh no c min gi tr dng. V d khi cn khai bo mt bin
lu gi tui ca mt ngi th ta dng kiu byte (s nguyn t 0-255) v tui ca ngi
khng th no m c.
Kiu float, double, v decimal a ra nhiu mc khc nhau v kch thc cng nh
chnh xc.Vi thao tc trn cc phn s nh th kiu float l thch hp nht. Tuy nhin lu
rng trnh bin dch lun lun hiu bt c mt s thc no cng l mt s kiu double tr khi
chng ta khai bo r rng. gn mt s kiu float th s phi c k t f theo sau.
float soFloat = 24f;
ngha
Du nhy n
Du nhy kp
\0
Du cho
K t null
\a
Alert
\\
42
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
\b
Backspace
\f
\n
u dng
Tab ngang
\r
\t
\v
Tab dc
Bng 3.2 : Cc kiu k t c bit.
Tuy nhin, nu chng ta thc hin chuyn i ngc li, chc chn chng ta s b mt thng
tin. Nu gi tr ca s nguyn ln hn 32.767 th n s b ct khi chuyn i. Trnh bin
dch s khng thc hin vic chuyn i ngm nh t s kiu int sang s kiu short:
short x;
int y = 100;
x = y;
khng b li chng ta phi dng lnh gn tng minh, on m trn c vit li nh sau:
short x;
int y = 500;
x = (short) y;
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;
----------------------------------------------------------------------------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;
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
// C
---------------------------------------------------------------------------- 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
// C
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;
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,
}
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
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;
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;
hay
var1
= 24 ;
v trnh bin dch C# s xem hai cu lnh trn l hon ton ging nhau.
Tuy nhin lu l khong trng trong mt chui s khng c b qua. Nu chng ta vit:
System.WriteLine(Xin chao!);
Ngn Ng Lp Trnh C#
tng t nh:
int x=24;
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
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:
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
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
using System;
class TinhTrangKetHon
{
static void Main()
{
int tuoi;
bool coGiaDinh; // 0: cha c gia nh; 1: c gia nh
bool gioiTinh; // 0: gii tnh n; 1: gii tnh nam
tuoi = 24;
coGiaDinh = false; // cha c gia nh
gioiTinh = true; // nam
if ( tuoi >= 19)
{
if ( coGiaDinh == false)
{
if ( gioiTinh == false) // nu
Console.WriteLine( Nu co the ket hon);
else // nam
55
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
Nam co the ket hon
----------------------------------------------------------------------------Theo trnh t kim tra th cu lnh if u tin c thc hin, biu thc iu kin ng do
tui c gi tr l 24 ln hn 19. Khi khi lnh trong if s c thc thi. trong khi ny
li xut hin mt lnh if khc kim tra tnh trng xem ngi c gia nh cha, kt
qu iu kin if l ng v coGiaDinh = false nn biu thc so snh coGiaDinh == false s
tr v gi tr ng. Tip tc xt xem gii tnh ca ngi l nam hay n, v ch c nam trn
19 tui mi c kt hn. Kt qu kim tra l nam nn cu lnh if th ba c thc hin v
xut ra kt qu : Nam co the ket hon.
Cu lnh switch
Khi c qu nhiu iu kin chn thc hin th dng cu lnh if s rt ri rm v di
dng, Cc ngn ng lp trnh cp cao u cung cp mt dng cu lnh switch lit k cc gi
tr v ch thc hin cc gi tr thch hp. C# cng cung cp cu lnh nhy switch c c php
sau:
switch (biu thc iu kin)
{
case <gi tr>:
<Cc cu lnh thc hin>
<lnh nhy>
[default:
<Cc cu lnh thc hin mc nh>]
}
Cng tng t nh cu lnh if, biu thc so snh c t sau t kha switch, tuy nhin
gi tr so snh li c t sau mi cc t kha case. Gi tr sau t kha case l cc gi tr
hng s nguyn nh cp trong phn trc.
56
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
57
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------Trong v d 3.9 trn lit k by loi mu v dng cu lnh switch kim tra cc trng hp
chn mu. y chng ta th phn tch tg cu lnh case m khng quan tm n gi tr
bin chonMau.
Gi tr chonMau
mauDo
case mauDo
mauCam
case mauCam
mauVang
case mauVang
Kt qu thc hin
Ban chon mau do
Ban chon mau cam
Ban chon mau luc
case mauLuc
mauLuc
case mauLuc
mauLam
case mauLam
case mauCham
case mauTim
case mauLuc
mauCham
case mauCham
case mauTim
case mauLuc
mauTim
case mauTim
case mauLuc
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------Ghi ch: i vi ngi lp trnh C/C++, trong C# chng ta khng th nhy xung mt
trng hp case tip theo nu cu lnh case hin ti khng rng. V vy chng ta phi vit
nh sau:
case 1:
// nhy xung
case 2:
Nh minh ha trn th trng hp x l case 1 l rng, tuy nhin chng ta khng th vit
nh sau:
case 1:
DoAnything();
// Trng hp ny khng th nhy xung case 2
case 2:
Do vy khi thc hin xong cc cu lnh ca mt trng hp nu mun thc hin mt trng
hp case khc th ta dng cu lnh nhy goto vi nhn ca trng hp :
goto case <gi tr>
Khi gp lnh thot break th chng trnh thot khi switch v thc hin lnh tip sau khi
switch .
Nu khng c trng hp no thch hp v trong cu lnh switch c dng cu lnh defalut
th cc cu lnh ca trng hp default s c thc hin. Ta c th dng default cnh
bo mt li hay x l mt trng hp ngoi tt c cc trng hp case trong switch.
Trong v d minh ha cu lnh switch trc th gi tr kim tra cc trng hp thch hp
l cc hng s nguyn. Tuy nhin C# cn c kh nng cho php chng ta dng cu lnh
switch vi gi tr l mt chui, c th vit nh sau:
switch (chuoi1)
{
case mau do:
....
break;
case mau cam:
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
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
Vng lp for bao gm ba phn chnh:
Khi to bin m vng lp
Kim tra iu kin bin m, nu ng th s thc hin cc lnh bn trong vng for
Thay i bc lp.
C php s dng vng lp for nh sau:
for ([ phn khi to] ; [biu thc iu kin]; [bc lp])
<Cu lnh thc hin>
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
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;
}
}
65
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
1 2 3 4 5 6 7 8 9 10
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;
}
}
67
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------im chnh yu ca on chng trnh trn l khi nhp vo tn hiu T th sau khi thc hin
mt s hnh ng cn thit chng trnh s thot ra khi vng lp v khng xut ra cu thng
bo bip bip bip. Ngc li khi nhn c tn hiu 0 th sau khi xut thng bo chng trnh s
quay v u vng lp thc hin tip tc v cng khng xut ra cu thng bo bip bip bip.
Ton t
Ton t c k hiu bng mt biu tng dng thc hin mt hnh ng. Cc kiu
d liu c bn ca C# nh kiu nguyn h tr rt nhiu cc ton t nh ton t gn, ton t
ton hc, logic....
Ton t gn
n lc ny ton t gn kh quen thuc vi chng ta, hu ht cc chng trnh minh
ha t u sch u s dng php gn. Ton t gn hay php gn lm cho ton hng bn
tri thay i gi tr bng vi gi tr ca ton hng bn phi. Ton t gn l ton t hai ngi.
y l ton t n gin nht thng dng nht v cng d s dng nht.
Ton t ton hc
Ngn ng C# cung cp nm ton t ton hc, bao gm bn ton t u cc php ton
c bn. Ton t cui cng l ton t chia nguyn ly phn d. Chng ta s tm hiu chi tit
cc php ton ny trong phn tip sau.
Cc php ton s hc c bn (+,-,*,/)
Cc php ton ny khng th thiu trong bt c ngn ng lp trnh no, C# cng
khng ngoi l, cc php ton s hc n gin nhng rt cn thit bao gm: php cng (+),
php tr (-), php nhn (*), php chia (/) nguyn v khng nguyn.
Khi chia hai s nguyn, th C# s b phn phn s, hay b phn d, tc l nu ta chia 8/3 th
s c kt qu l 2 v s b phn d l 2, do vy ly c phn d ny th C# cung cp
thm ton t ly d s c trnh by trong phn k tip.
Tuy nhin, khi chia cho s thc c kiu nh float, double, hay decimal th kt qu chia c
tr v l mt s thc.
Php ton chia ly d
tm phn d ca php chia nguyn, chng ta s dng ton t chia ly d (%). V
d, cu lnh sau 8%3 th kt qu tr v l 2 (y l phn d cn li ca php chia nguyn).
Tht s php ton chia ly d rt hu dng cho ngi lp trnh . Khi chng ta thc hin mt
php chia d n cho mt s khc, nu s ny l bi s ca n th kt qu ca php chia d l 0.
V d 20 % 5 = 0 v 20 l mt bi s ca 5. iu ny cho php chng ta ng dng trong
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
-----------------------------------------------------------------------------
Trong cu lnh trn php cng c thc hin trc, khi kt qu ca v phi l 1.700.000
v kt qu ny s c gn li cho bin Luong, cui cng Luong c gi tr l 1.700.000.
Chng ta c th thc hin vic thay i gi tr ri gn li cho bin vi bt k php ton s hc
no:
Luong = Luong * 2;
Luong = Luong 100.000;
...
Do vic tng hay gim gi tr ca mt bin rt thng xy ra trong khi tnh ton nn C# cung
cp cc php ton t gn (self- assignment). Bng sau lit k cc php ton t gn.
Ton t
+=
-=
*=
/=
%=
ngha
Cng thm gi tr ton hng bn phi
vo gi tr ton hng bn tri
Ton hng bn tri c tr bt i mt
lng bng gi tr ca ton hng bn
phi
Ton hng bn tri c nhn vi mt
lng bng gi tr ca ton hng bn
phi.
Ton hng bn tri c chia vi mt
lng bng gi tr ca ton hng bn
phi.
Ton hng bn tri c chia ly d vi
mt lng bng gi tr ca ton hng
bn phi.
Ngn Ng Lp Trnh C#
Luong += 200.000;
Luong *= 2;
Luong -= 100.000;
var1 = var2++;
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.
Tn ton t
So snh bng
Khng bng
Ln hn
Ln hn hay bng
Nh hn
K hiu
==
!=
>
>=
<
Kt qu so snh
value1 == 100
true
value1 == 50
false
value2 != 100
false
value2 != 90
true
true
false
value2 >= 50
true
false
true
Nh hn hay bng
<=
value1 <= value2
false
Bng 3.4: Cc ton t so snh (gi s value1 = 100, v value2 = 50).
Nh trong bng 3.4 trn ta lu ton t so snh bng (==), ton t ny c k hiu bi hai
du bng (=) lin nhau v cng trn mt hng , khng c bt k khong trng no xut hin
gia chng. Trnh bin dch C# xem hai du ny nh mt ton t.
Ton t logic
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.
Tn ton t
K hiu
and
&&
Gi tr
false
7)
or
||
(x == 3) || (y == 7)
true
not
! (x == 3 )
true
Logic
C hai iu kin
phi ng
Ch cn mt iu
kin ng
Biu thc trong
ngoc phi sai.
Khi biu thc if s ng khi c hai biu thc con l (x == 5) v (y == 10) ng. Tuy
nhin khi xt biu thc th nht do gi tr x l 8 nn biu thc (x == 5) l sai. Khi khng
cn thit xc nh gi tr ca biu thc cn li, tc l vi bt k gi tr no ca biu thc (y
== 10) th ton b biu thc iu kin if vn sai.
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))
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;
Loi ton t
Php ton c bn
Ton t
Th t
(x) x.y f(x) a[x] x++ xnew typeof Tri
sizeof checked unchecked
2
3
Php nhn
*/%
4
5
Php cng
Dch bit
+<< >>
Tri
Tri
Quan h
Tri
+ - ! ~ ++x x (T)x
Tri
Tri
74
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
So snh bng
Php
AND
Php
XOR
Phi
== !=
ton
logic &
Tri
ton
logic ^
Tri
10
11
12
13
iu kin OR
iu kin
||
14
Php gn
= *= /= %= += -= <<= >>=
Tri
Tri
&&
Tri
Phi
?:
&=
Phi
^= |=
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>
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 >
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;
}
}
}
77
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
}
}
78
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
Lop Exemple1
Lop Exemple2
----------------------------------------------------------------------------V d 3.22 trn c hai im cn lu l cch gi mt namespace thnh vin v cch khai bo
cc namspace. Nh chng ta thy trong namespace MyLib c hai namespace con cng cp l
Demo1 v Demo2, hm Main ca Demo2 s c chng trnh thc hin, v trong hm Main
ny c gi hai hm thnh vin tnh ca hai lp Example1 v Example2 ca namespace
Demo1.
V d trn cng a ra cch khai bo khc cc lp trong namespace. Hai lp Example1 v
Example2 iu cng thuc mt namespace MyLib.Demo1, tuy nhin Example2 c khai bo
mt khi ring l bng cch s dng khai bo:
namespace MyLib.Demo1
{
class Example2
{
....
}
}
Vic khai bo ring l ny c th cho php trn nhiu tp tin ngun khc nhau, min sao m
bo khai bo ng tn namspace th chng vn thuc v cng mt namespace.
Cc ch dn bin dch
i vi cc v d minh ha trong cc phn trc, khi bin dch th ton b chng
trnh s c bin dch. Tuy nhin, c yu cu thc t l chng ta ch mun mt phn trong
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
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#
....
#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
....
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
}
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);
}
}
}
84
Nn Tng Ngn Ng C#
Ngn Ng Lp Trnh C#
$$$$$$
$$$$$
$$$$
$$$
$$
$
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
To i tng
B khi dng
T kha this
Hy i tng
Truyn tham s
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#
Thnh phn thuc tnh ca i tng s c trnh by chi tit trong chng sau, cn thnh
phn b sung truy cp cng s c trnh by tip ngay mc di. nh danh lp chnh l tn
ca lp do ngi xy dng chng trnh to ra. Lp c s l lp m i tng s k tha
pht trin ta s bn sau. Tt c cc thnh vin ca lp c nh ngha bn trong thn ca lp,
phn thn ny s c bao bc bi hai du ({}).
Ghi ch: Trong ngn ng C# phn kt thc ca lp khng c u chm phy ging nh
khai bo lp trong ngn ng C/C++. Tuy nhin nu ngi lp trnh thm vo th trnh bin
dch C# vn chp nhn m khng a ra cnh bo li.
Trong C#, mi chuyn u xy ra trong mt lp. Nh cc v d m chng ta tm hiu trong
chng 3, cc hm iu c a vo trong mt lp, k c hm u vo ca chng trnh
(hm Main()):
public class Tester
{
public static int Main()
{
//....
}
}
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;
90
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
Hien thi thoi gian hien hanh
private
protected
internal
protected internal
Gii hn truy cp
Khng hn ch. Nhng thnh vin c nh du
public c th c dng bi bt k cc phng thc ca
lp bao gm nhng lp khc.
Thnh vin trong mt lp A c nh du l private
th ch c truy cp bi cc phng thc ca lp A.
Thnh vin trong lp A c nh du l protected
th ch c cc phng thc bn trong lp A v nhng
phng thc dn xut t lp A truy cp.
Thnh vin trong lp A c nh du l internal th
c truy cp bi nhng phng thc ca bt c lp
no trong cng khi hp ng vi A.
Thnh vin trong lp A c nh du l protected
internal c truy cp bi cc phng thc ca lp A,
cc phng thc ca lp dn xut ca A, v bt c lp
no trong cng khi hp ng ca A.
91
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
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();
Gi tr mc nh
bool
false
char
\0 (null)
enum
reference
null
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------95
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
Kt qu:
Thoi gian hien hanh la: 5/6/2002
9:10:20
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#
// Khi to
}
public ThoiGian(int Year, int Month, int Date, int Hour, int Minute)
{
Nam = Year;
Thang = Month;
Ngay = Date;
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
Hien tai:
5/6/2002
10:15:5
Thoi Gian:
3/7/2001
10:5:30
// Khi to
Trong trng hp b khi to th hai khng truyn gi tr cho bin Giay nn bin ny vn ly
gi tr m ta khi to ban u l 30:
ThoiGian t2 = new ThoiGian(2001, 7, 3, 10, 5);
t2.ThoiGianHienHanh();
98
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
Trong t1 l i tng ThoiGian tn ti, sau khi lnh trn thc hin xong th i tng
t2 c to ra nh bn sao ca i tng t1.
T kha this
T kha this c dng tham chiu n th hin hin hnh ca mt i tng. Tham
chiu this ny c xem l con tr n n tt cc phng thc khng c thuc tnh tnh trong
mt lp. Mi phng thc c th tham chiu n nhng phng thc khc v cc bin thnh
vin thng qua tham chiu this ny.
Tham chiu this ny c s dng thng xuyn theo ba cch:
S dng khi cc bin thnh vin b che lp bi tham s a vo, nh trng hp sau:
public void SetYear( int Nam)
{
this.Nam = Nam;
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
thc ca i tng khc:
public void Method1( OtherClass otherObject )
{
// S dng tham chiu this truyn tham s l bn
// thn i tng ang thc hin.
otherObject.SetObject( this );
}
Nh trn cho thy khi cn truyn mt tham s l chnh bn thn ca i tng ang thc hin
th ta bt buc phi dng tham chiu this truyn.
Cc th ba s dng tham chiu this l mng ch mc (indexer), phn ny s c trnh
by chi tit trong chng 9.
ng hn l vit:
btnUpdate.Show();
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.
Ngn Ng Lp Trnh C#
Lu rng y khng c bt c thuc tnh truy cp no nh public trc b khi dng tnh.
Thuc tnh truy cp khng cho php theo sau mt phng thc khi dng tnh. Do phng
thc tnh nn khng th truy cp bt c bin thnh vin khng thuc loi tnh, v vy bin
thnh vin Name bn trn cng phi c khai bo l tnh:
private static string Ten;
5/6/2002
18:35:20
Mc d chng trnh thc hin tt, nhng khng cn thit phi to ra b khi dng tnh
phc v cho mc ch ny. Thay vo ta c th dng chc nng khi to bin thnh vin
nh sau:
private static string Ten = Thoi Gian;
Tuy nhin, b khi to tnh c hu dng khi chng ta cn ci t mt s cng vic m khng
th thc hin c thng qua chc nng khi dng v cng vic ci t ny ch c thc
hin duy nht mt ln.
102
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
103
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
0 cats
1 cats
3 cats
----------------------------------------------------------------------------Bn trong lp Cat ta khai bo mt bin thnh vin tnh tn l instance bin ny dng m
s th hin ca lp Cat, bin ny c khi to gi tr 0. Lu rng bin thnh vin tnh c
xem l thnh phn ca lp, khng phi l thnh vin ca th hin, do vy n s khng c
khi to bi trnh bin dch khi to cc th hin. Khi to tng minh l yu cu bt buc vi
cc bin thnh vin tnh. Khi mt th hin c to ra th b dng ca lp Cat s thc hin
tng bin instance ln mt n v.
Hy i tng
Ngn ng C# cung cp c ch thu dn (garbage collection) v do vy khng cn phi khai
bo tng minh cc phng thc hy. Tuy nhin, khi lm vic vi cc on m khng c
qun l th cn phi khai bo tng minh cc phng thc hy gii phng cc ti nguyn.
C# cung cp ngn nh mt phng thc thc hin iu khin cng vic ny, phng thc
l Finalize() hay cn gi l b kt thc. Phng thc Finalize ny s c gi bi c ch
thu dn khi i tng b hy.
Phng thc kt thc ch gii phng cc ti nguyn m i tng nm gi, v khng tham
chiu n cc i tng khc. Nu vi nhng on m bnh thng tc l cha cc tham
chiu kim sot c th khng cn thit phi to v thc thi phng thc Finalize(). Chng
ta ch lm iu ny khi x l cc ti nguyn khng kim sot c.
Chng ta khng bao gi gi mt phng thc Finalize() ca mt i tng mt cch trc
tip, ngoi tr gi phng thc ny ca lp c s khi bn trong phng thc Finalize() ca
chng ta. Trnh thu dn s thc hin vic gi Finalize() cho chng ta.
Cch Finalize thc hin
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() {}
Ngn Ng Lp Trnh 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.
Ngn Ng Lp Trnh C#
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
----------------------------------------------------------------------------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;
}
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.
Vic s dng cc on lnh trn khng phi hon ton v l v mc ch ca chng ta l nhn
cc gi tr ca i tng Time, vic khi to gi tr ca cc bin a vo l khng cn thit.
Tuy nhin khi bin dch vi on m lnh nh trn s c bo cc li sau:
Use of unassigned local variable theHour
Use of unassigned local variable theMinute
Use of unassigned local variable theSecond
110
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
m = Minute;
s = Second;
}
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#
----------------------------------------------------------------------------Phng thc SetTime trn minh ha vic s dng ba kiu truyn tham s vo mt phng
thc. Tham s th nht theHour c truyn vo dng gi tr, mc ch ca tham s ny l
thit lp gi tr cho bin thnh vin Hour v tham s ny khng c s dng v bt c gi
tr no.
Tham s th hai l theMinute c truyn vo phng thc ch nhn gi tr tr v ca bin
thnh vin Minute, do tham s ny c khai bo vi t kha out.
Cui cng tham s theSecond c truyn vo vi khai bo ref, bin tham s ny va dng
thit lp gi tr trong phng thc. Nu theSecond ln hn 30 th gi tr ca bin thnh
vin Minute tng thm mt n v v bin thnh vin Second c thit lp v 0. Sau cng
th theSecond c gn gi tr ca bin thnh vin Second v c tr v.
Do hai bin theHour v theSecond c s dng trong phng thc SetTime nn phi c
khi to trc khi truyn vo phng thc. Cn vi bin theMinute th khng cn thit v n
khng c s dng trong phng thc m ch nhn gi tr tr v.
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#
---------------------------------------------------------------------------- Kt qu:
2/1/2002
17:50:17
8/6/2002
18:15:20
----------------------------------------------------------------------------Nh chng ta thy, lp Time trong v d minh ha 4.9 c hai phng thc khi dng. Nu hai
phng thc c cng k hiu th trnh bin dch s khng th bit c gi phng thc no
khi khi to hai i tng l t1 v t2. Tuy nhin, k hiu ca hai phng thc ny khc nhau
v tham s truyn vo khc nhau, do trnh bin dch s xc nh c phng thc no
c gi da vo cc tham s.
Khi thc hin np chng mt phng thc, bt buc chng ta phi thay i k hiu ca
phng thc, s tham s, hay kiu d liu ca tham s. Chng ta cng c th ton quyn thay
i gi tr tr v, nhng y l ty chn. Nu ch thay i gi tr tr v th khng phi np
chng phng thc m khi hai phng thc khc nhau, v nu to ra hai phng thc
cng k hiu nhng khc nhau kiu gi tr tr v s to ra mt li bin dch.
V d 4.10: Np chng phng thc.
----------------------------------------------------------------------------using System;
public class Tester
{
private int Triple( int val)
{
return 3*val;
}
private long Triple(long val)
{
return 3*val;
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.
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#
---------------------------------------------------------------------------- Kt qu:
Time
: 2/1/2003 17:55:1
---------------------------------------------------------------------------- khai bo thuc tnh, u tin l khai bo tn thuc tnh truy cp, tip theo l phn thn
nh ngha thuc tnh nm trong cp du ({}). Bn trong thn ca thuc tnh l khai bo hai
b truy cp ly v thit lp d liu:
public int Hour
{
get
{
return hour;
}
set
{
hour = value;
}
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;
Nh ni trc, do ta ang khai bo thuc tnh lu tr di dng bin thnh vin nn trong
phn thn ca b truy cp ta ch s dng bin thnh vin m thi. B truy cp thit lp hon
ton cho php chng ta c th vit gi tr vo trong c s d lu hay cp nht bt c bin
thnh vin no khc ca lp nu cn thit.
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;
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;
}
}
124
Xy Dng Lp - i Tng
Ngn Ng Lp Trnh C#
Chng 5
K THA A HNH
c bit ha v tng qut ha
S k tha
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.
Ngn ng m hnh ha thng nht (UML)
UML ( Unified Modeling Language) l ngn ng chun ha m t cho
mt h thng hoc thng mi. Trong chng ny s dng mt s phn
ca m hnh UML trnh by cc biu quan h gia cc lp.
Trong UML, nhng lp c th hin nh cc khi hp, tn ca lp c
t trn cng ca khi hp, v cc phng thc hay cc bin thnh vin
c t bn trong hp.
Nh trong hnh 5.1, m hnh quan h tng qut ha v c bit ha c
trnh by qua UML, ghi ch rng mi tn i t cc lp c bit ha n
lp tng qut ha.
Window
Button
List Box
Window
K Tha a Hnh
127
Radio
Button
Check Box
Command
List Box
Ngn Ng Lp Trnh C#
Window
Button
Check Box
List Box
Command
Radio
Button
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!
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
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.
Ngn Ng Lp Trnh C#
T kha override bo vi trnh bin dch rng lp ny thc hin vic ph quyt li phng
thc DrawWindow() ca lp c s. Tng t nh vy ta c th thc hin vic ph quyt
phng thc ny trong mt lp dn xut khc nh Button, lp ny cng c dn xut t
Window.
Trong phn thn ca v d 5.2, u tin ta to ra ba i tng, i tng th nht ca
Window, i tng th hai ca lp ListBox v i tng cui cng ca lp Button. Sau ta
thc hin vic gi phng thc DrawWindow() cho mi i tng sau:
Window win = new Window( 1, 2 );
ListBox lb = new ListBox( 3, 4, Stand alone list box);
Button b = new Button( 5, 6 );
win.DrawWindow();
lb.DrawWindow();
b.DrawWindow();
on chng trnh trn thc hin cc cng vic nh yu cu ca chng ta, l tng i tng
thc hin cng vic t v ca n. Tuy nhin, cho n lc ny th cha c bt c s a hnh
no c thc thi. Mi chuyn vn bnh thng cho n khi ta mun to ra mt mng cc i
tng Window, bi v ListBox cng l mt Window nn ta c th t do t mt i tng
ListBox vo v tr ca mt i tng Window trong mng trn. V tng t ta cng c th t
mt i tng Button vo bt c v tr no trong mng cc i tng Window, v mt Button
cng l mt Window.
Window[] winArray = new Window[3];
winArray[0] = new Window( 1, 2 );
winArray[1] = new ListBox( 3, 4, List box is array);
winArray[2] = new Button( 5, 6 );
Chuyn g xy ra khi chng ta gi phng thc DrawWindow() cho tng i tng trong
mng winArray.
for( int i = 0; i < 3 ; i++)
{
winArray[i].DrawWindow();
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,
{
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
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#
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.
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( );
}
}
}
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
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#
Chc nng
So snh bng nhau gia hai i tng
Cho php nhng i tng cung cp ring
nhng hm bm cho s dng tp hp.
Cung cp kiu ca i tng
Cung cp chui th hin ca i tng
Dn dp cc ti nguyn
To mt bn sao t i tng.
Bng 5.1: Tm tt cc phng thc ca lp Object.
V d 5.4 sau minh ha vic s dng phng thc ToString( ) tha k t lp Object.
V d 5.4: Tha k t Object.
MemberwiseClone( )
----------------------------------------------------------------------------using System;
public class SomeClass
{
public SomeClass( int val )
{
value = val;
}
// ph quyt phng thc ToString ca lp Object
public virtual string ToString()
{
return value.ToString();
}
// bin thnh vin private lu gi tr
private int value;
}
public class Tester
{
static void Main( )
{
int i = 5;
Console.WriteLine(The value of i is: {0}, i.ToString());
SomeClass s = new SomeClass(7);
Console.WriteLine(The value of s is {0}, s.ToString());
143
K Tha a Hnh
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
The value of i is: 5
The value of s is 7
The value of 5 is 5
144
K Tha a Hnh
Ngn Ng Lp Trnh C#
Stack
Heap
i
123
int i = 123;
i boxed
o
123
object o=i;
Int
123
Ngn Ng Lp Trnh C#
Heap
Stack
i
123
int i = 123;
i
o
123
boxed
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#
}
}
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#
----------------------------------------------------------------------------Lp Fraction trn ni chung l khng c g thay i ngoi tr vic thm mt lp lng bn
trong v lc i mt s phng thc khng thch hp trong v d ny. Lp lng bn trong
148
K Tha a Hnh
Ngn Ng Lp Trnh C#
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:
FractionArtist
Fraction.FractionArtist
fa = new Fraction.FractionArtist();
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
S dng t kha operator
H tr ngn ng .NET khc
S dng ton t
Ton t so snh bng
Ton t chuyn i
Cu hi & bi tp
Hng thit k ca ngn ng C# l tt c cc lp do ngi dng nh ngha (userdefined classes) c tt c cc chc nng ca cc lp c xy dng sn. V d, gi s chng
ta nh ngha mt lp th hin mt phn s. m bo rng lp ny c tt c cc chc
nng tng t nh cc lp c xy dng sn, ngha l chng ta cho php thc hin cc php
ton s hc trn cc th hin ca phn s chng ta (nh cc php ton cng phn s, nhn hai
phn s,...) v chuyn i qua li gia phn s v kiu d liu xy dng sn nh kiu nguyn
(int). D nhin l chng ta c th d dng thc hin cc ton t bng cch gi mt phng
thc, tng t nh cu lnh sau:
Fraction theSum = firstFraction.Add( secondFraction );
Mc d cch thc hin ny khng sai nhng v trc quan th rt t khng c t nhin nh
kiu d lu c xy dng sn. Cch thc hin sau s tt hn rt nhiu nu ta thit k c:
Fraction theSum = firstFraction + secondFraction;
Cch thc hin ny xem trc quan hn v ging vi cch thc hin ca cc lp c xy
dng sn, ging nh khi thc hin php cng gia hai s nguyn int.
Trong chng ny chng ta s tm hiu k thut thm cc ton t chun vo kiu d liu do
ngi dng nh ngha. V chng ta s tm hiu cc ton t chuyn i chuyn i kiu d
liu do ngi dng nh ngha mt cch tng minh hay ngm nh sang cc kiu d liu
khc.
Ngn Ng Lp Trnh C#
Trong ton t trn ta c s qui c t tn ca tham s l lhs v rhs. Tham s tn lhs thay
th cho left hand side tc l ton hng bn tri, tng t tham s tn rhs thay th cho right
hand side tc l ton hng bn phi.
C php ngn ng C# cho php np chng mt ton t bng cch vit t kha operator
v theo sau l ton t c np chng. T kha operator l mt b sung phng thc
(method operator). Nh vy, np chng ton t cng (+) chng ta c th vit operator +.
Khi chng ta vit:
Fraction theSum = firstFraction + secondFraction;
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 Specification (CLS).
S dng np chng ton t trong trng hp kt qu tr v ca ton t l tht s r rng.
V d, nh thc hin ton t tr (-) gia mt gi tr Time vi mt gi tr Time khc l mt
ton t c ngha. Tuy nhin, nu chng ta thc hin ton t or hay ton t and gia hai i
tng Time th kt qu hon ton khng c ngha g ht.
Np chng ton t c tnh cht i xng. V d, nu chng ta np chng ton t bng
(==) th cng phi np chng ton t khng bng (!=). Do khi thc hin ton t c tnh
cht i xng th phi thc hin ton t i xng li nh: < vi >, <= vi >=.
Phi cung cp cc phng thc thay th cho ton t c np chng. a s cc ngn
ng iu khng h tr np chng ton t. V nguyn do ny nn chng ta phi thc thi
cc phng thc th hai c cng chc nng vi cc ton t. Common Language
Specification (CLS) i hi phi thc hin phng thc th hai tng ng.
Bng 6.1 sau trnh by cc ton t cng vi biu tng ca ton t v cc tn ca phng
thc thay th cc ton t.
Biu tng
Add
Tn ton t
Ton t cng
Subtract
Ton t tr
Multiply
Ton t nhn
155
Np Chng Ton T
Ngn Ng Lp Trnh C#
Divide
Ton t chia
Mod
Xor
Ton t chia ly d
Ton t or loi tr
&
BitwiseAnd
BitwiseOr
&&
And
||
Or
Assign
<<
LeftShift
>>
RightShift
==
Equals
>
Compare
<
Compare
!=
Compare
>=
Compare
<=
Compare
*=
Multiply
-=
Subtract
^=
Xor
<<=
LeftShift
%=
Mod
+=
Add
&=
BitwiseAnd
|=
BitwiseOr
/=
Divide
--
Decrement
++
Increment
Negate
Plus
OnesComplement
Ton t b
Bng 6.1: Tm tt mt s ton t trong C#.
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
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#
160
Np Chng Ton T
Ngn Ng Lp Trnh C#
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;
}
Ton t + c gi trc sau n phng thc khi dng ca i tng f3. Phng thc
khi dng ny ly hai tham s nguyn to t s v mu s ca phn s mi f3.
162
Np Chng Ton T
Ngn Ng Lp Trnh C#
Ghi ch: rng ton t chuyn i ngm nh c gi khi chuyn 5 thnh mt phn s.
Phn s c to ra t ton t chuyn i ngm nh ny gi phng thc khi dng mt
tham s to phn s mi 5/1. Phn s mi ny s c chuyn thnh ton hng trong php
cng vi phn s f3 v kt qu tr v l phn s f4 l tng ca hai phn s trn.
Th nghim cui cng l to mt phn s mi f5, ri sau gi ton t np chng so snh
bng kim tra xem hai phn s c bng nhau hay khng.
Cu hi v tr li
Cu hi 1: C phi khi xy dng cc lp chng ta ch cn dng np chng ton t vi cc
chc nng tnh ton ?
Tr li 1: ng l nh vy, vic thc hin np chng ton t rt t nhin v trc quan. Tuy
nhin mt s ngn ng .NET nh VB.NET khng h tr vic np chng ton t nn, tt nht
nu mun cho lp trong C# ca chng ta c th c gi t ngn ng khc khng h tr np
chng ton t th nn xy dng cc phng thc tng ng thc hin cng chc nng
nh: Add, Sub, Mul,..
Cu hi 2: Nhng iu lu no khi s dng np chng ton t trong mt lp?
Tr li 2: Ni chung l khi no tht cn thit v t gy ra s nhm ln. V d nh ta xy dng
lp Employee c nhiu thuc tnh s nh lng, thm nin, tui... Chng ta mun xy dng
ton t ++ cho lng nhng c th lm nhm ln vi vic tng s nm cng tc, hay tng
tui. Do vy vic s dng np chng ton t cng phi cn nhc trnh gy nhm ln. Tt
nht l s dng trong lp c t thuc tnh s...
Cu hi 3: Khi xy dng ton t so snh th c phi ch cn dng ton t so snh bng?
Tr li 3: ng l nu cn dng ton t so snh no th chng ta c th ch to ra duy nht
ton t so snh m thi. Tuy nhin, tt hn l chng ta cng nn xy dng thm ton t so
snh khc nh: so snh khc, so snh nh hn, so snh ln hn...Vic ny s lm cho lp ca
chng ta hon thin hn.
Cu hi thm
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#
166
Cu Trc
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------Khng ging nh nhng lp, cu trc khng h tr vic tha k. Chng c tha k ngm
nh t lp object (tng t nh tt c cc kiu d liu trong C#, bao gm cc kiu d liu
xy dng sn) nhng khng th k tha t cc lp khc hay cu trc khc. Cu trc cng
c ngm nh l sealed, iu ny c ngha l khng c lp no hay bt c cu trc no
c th dn xut t n. Tuy nhin, cng ging nh cc lp, cu trc c th thc thi nhiu giao
din. Sau y l mt s s khc nhau na l:
Khng c b hy v b khi to mc nh ty chn: Nhng cu trc khng c b hy v
cng khng c b khi to mc nh khng tham s ty chn. Nu chng ta khng cung
cp bt c b khi to no th cu trc s c cung cp mt b khi to mc nh, khi
gi tr 0 s c thit lp cho tt c cc d liu thnh vin hay nhng gi tr mc nh
tng ng cho tng kiu d liu (bng 4.2). Nu chng ta cung cp bt c b khi dng
no th chng ta phi khi to tt c cc trng trong cu trc.
167
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;
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);
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);
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#
Khi phng thc myFunc() tr v cho hm gi ( Main()) v chng ta gi tip phng thc
WriteLine() mt ln na th gi tr khng thay i:
Loc1 location: 200, 300
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
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
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;
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);
}
}
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.
Phn thuc tnh chng ta s cp sau. Thnh phn b sung truy cp bao gm:
public, private, protected, internal, v protected internal c ni n trong
Chng 4, ngha tng t nh cc b sung truy cp ca lp.
Theo sau t kha interface l tn ca giao din. Thng thng tn ca giao din
c bt u vi t I hoa (iu ny khng bt buc nhng vic t tn nh vy rt r rng v
d hiu, trnh nhm ln vi cc thnh phn khc). V d mt s giao din c tn nh sau:
IStorable, ICloneable,...
Danh sch c s l danh sch cc giao din m giao din ny m rng, phn ny s
c trnh by trong phn thc thi nhiu giao din ca chng. Phn thn ca giao din chnh
l phn thc thi giao din s c trnh by bn di.
Gi s chng ta mun to mt giao din nhm m t nhng phng thc v thuc tnh
ca mt lp cn thit lu tr v truy cp t mt c s d liu hay cc thnh phn lu tr
d liu khc nh l mt tp tin. Chng ta quyt nh gi giao din ny l IStorage.
Trong giao din ny chng ta xc nhn hai phng thc: Read() v Write(), khai bo
ny s c xut hin trong phn thn ca giao din nh sau:
interface IStorable
{
void Read();
void Write(object);
}
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();
}
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();
isc.LogSavedBytes();
// IStorableCompressible
// 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 ILoggedCompressible 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
}
// IStorableCompressible
186
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
isc.LogSaveBytes(); // ILoggedCompressible
isc.Compress(); // ICompress
isc.Read();
// IStorable
hay l ta c th to th hin ca giao din bng cch gn i tng Document cho mt kiu
d liu giao din, v sau s dng giao din ny truy cp cc phng thc:
IStorable isDoc = (IStorable) doc;
isDoc.status = 0;
isDoc.Read();
Sau chng ta c th to th hin ca giao din bng cch gn i tng thc thi n kiu
d liu giao din, trong trng hp ny l IStorable:
IStorable isDoc = (IStorable) doc;
Ni chung, cch thit k tt nht l quyt nh truy cp nhng phng thc ca giao din
thng qua tham chiu ca giao din. Do vy cch tt nht l s dng isDoc.Read(), hn l s
dng doc.Read() trong v d trc. Truy cp thng qua giao din cho php chng ta i x
giao din mt cch a hnh. Ni cch khc, chng ta to hai hay nhiu hn nhng lp thc thi
giao din, v sau bng cch truy cp lp ny ch thng qua giao din.
187
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
void Compress();
void Decompress();
}
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>
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
IL_0037: br.s
IL_0043
IL_0039: ldstr
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#
ICompressible
IL_0028: stloc.2
IL_0029: ldloc.2
IL_002a: brfalse.s
IL_0034
IL_002c: ldloc.2
IL_002d: callvirt
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#
---------------------------------------------------------------------------- Kt qu:
Creating document with: Test Note
Creating note with: Test Note
Overriding the Read method for Note!
Document Write Method for IStorable
Overriding the Read method for Note!
Document Write Method for IStorable
Creating document with: Second Test
Creating note with: Second Test
Overriding the Read method for Note!
Document Write Method for IStorable
Overriding the Read method for Note!
Implementing the Write method for Note!
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()
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
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();
197
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
Trnh bin dch ch hiu rng chng ta thc thi phng thc giao din ngm nh cho
IStorable. Ch mt cch duy nht truy cp cc phng thc thc thi tng minh l thng qua
vic gn cho giao din thc thi:
ITalk itDoc = theDoc as ITalk;
if ( itDoc != null )
{
itDoc.Read();
}
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();
}
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#
---------------------------------------------------------------------------- Kt qu:
theStruct.Status: -1
Changed object.
theStruct.Status: 2
Changed interface
theStruct.Status: 2, isTemp: 4
Changed object
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
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
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);
206 (0xce)
.maxstack
.local
IL_0000:
ldloca.s
theStruct
IL_0002:
iniobj
myStruct
IL_0008:
ldloca.s
theStruct
IL_000a:
ldc.i4.ml
IL_000b:
call
IL_0010:
ldstr
theStruct.Status: {0}
IL_0015:
ldloca.s
theStruct
IL_0017:
call
IL_001c:
stloc.2
IL_001d:
ldloca.s
V_2
IL_001f:
box
[mscorlib]System.Int32
IL_0024:
call
ldloca.s
IL_002b:
ldc.i4.2
IL_002c:
call
theStruct
instance void myStruct::set_status(int32)
205
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
IL_0031:
ldstr
Changed object
IL_0036:
call
void [mscorlib]System.Console::WriteLine
(class System.String)
IL_003b:
ldstr
theStruct.Status: {0}
IL_0040:
ldloca.s
theStruct
IL_0042:
call
IL_0047:
stloc.2
IL_0048:
ldloca.s
V_2
IL_004a:
box
[mscorlib]System.Int32
IL_004f:
call
void [mscorlib]System.Console::WriteLine
ldloca.s
theStruct
IL_0056:
box
myStruct
IL_005b:
stloc.1
IL_005c:
ldloc.1
IL_005d:
ldc.i4.4
IL_005e:
callvirt
IL_0063:
ldstr
Changed interface
IL_0068:
call
void [mscorlib]System.Console::WriteLine
(class System.String)
IL_006d:
ldstr
IL_0072:
ldloca.s
theStruct
IL_0074:
call
IL_0079:
stloc.2
IL_007a:
ldloca.s
V_2
IL_007c:
box
[mscorlib]System.Int32
IL_0081:
ldloc.1
IL_0082:
callvirt
IL_0087:
stloc.2
IL_0088:
ldloca.s
V_2
IL_008a:
box
[mscorlib]System.Int32
IL_008f:
call
void [mscorlib]System.Console::WriteLine
ldloca.s
theStruct
IL_0096:
ldc.i4.6
IL_0097:
call
IL_009c:
ldstr
Changed object
IL_00a1:
call
void [mscorlib]System.Console::WriteLine
206
Thc Thi Giao Din
Ngn Ng Lp Trnh C#
(class System.String)
IL_00a6:
ldstr
IL_00ab:
ldloca.s
theStruct
IL_00ad:
call
IL_00b2:
stloc.2
IL_00b3:
ldloca.s
V_2
IL_00b5:
box
[mscorlib]System.Int32
IL_00ba:
ldloc.1
IL_00bb:
callvirt
IL_00c0:
stloc.2
IL_00c1:
ldloca.s
V_2
IL_00c3:
box
[mscorlib]System.Int32
IL_00c8:
call
void [mscorlib]System.Console::WriteLine
ret
----------------------------------------------------------------------------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
Chuyn i mng
System.Array
B ch mc
B ch mc v php gn
Giao din tp hp
Cu hi & bi tp
Mi trng .NET cung cp rt a dng s lng cc lp v tp hp, bao gm: Array,
ArrayList, Queue, Stack, BitArray, NameValueCollection, v StringCollection.
Trong s tp hp n gin nht l Array, y l kiu d liu tp hp m ngn ng C#
h tr xy dng sn. Chng ny chng ta s tm hiu cch lm vic vi mng mt chiu,
mng a chiu, v mng cc mng (jagged array). Chng ta cng c gii thiu phn ch
mc indexer, y l cch thit lp lm cho vic truy cp nhng thuc tnh ging nhau tr
nn n gin hn, mt lp c ch mc th ging nh mt mng.
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
BinarySearch()
Clear()
Copy()
CreateInstance()
IndexOf()
LastIndexOf()
Reverse()
Sort()
IsFixedSize
IsReadOnly
M t
Phng thc tnh public tm kim mt mng mt chiu
sp th t.
Phng thc tnh public thit lp cc thnh phn ca mng
v 0 hay null.
Phng thc tnh public np chng thc hin sao chp
mt vng ca mng vo mng khc.
Phng thc tnh public np chng to mt th hin mi
cho mng
Phng thc tnh public tr v ch mc ca th hin u tin
cha gi tr trong mng mt chiu
Phng thc tnh public tr v ch mc ca th hin cui
cng ca gi tr trong mng mt chiu
Phng thc tnh public o th t ca cc thnh phn trong
mng mt chiu
Phng thc tnh public sp xp gi tr trong mng mt
chiu.
Thuc tnh public gi tr bool th hin mng c kch thc
c nh hay khng.
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#
IsSynchronized
Length
Rank
SyncRoot
GetEnumerator()
GetLength()
GetLowerBound()
GetUpperBound()
Initialize()
SetValue()
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];
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];
myButtonArray;
Khng ging vi v d mng s nguyn trc, cu lnh ny khng tao ra mt mng vi nhng
tham chiu n ba i tng Button. Thay vo vic ny s to ra mt mng
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.
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
Khng c s khc bit gia hai c php trn, v hu ht cc chng trnh u s dng c
php ngn hn do s t nhin v li nh nhiu lnh ca ngi lp trnh.
217
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Tuy nhin, phng thc gi khng cn thit phi to tng minh mt mng, n ch n gin
truyn vo cc s nguyn, v trnh bin dch s kt hp nhng tham s ny vo trong mt
mng cho phng thc DisplayVals, ta c th gi phng thc nh sau:
t.DisplayVals(5,6,7,8);
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#
----------------------------------------------------------------------------Kt qu ca v d 9.2 cng tng t nh v d 9.1. Tuy nhin, vi vic s dng vng lp for
ta phi xc nh kch thc ca mng, s dng bin m tm thi truy cp n tng thnh
phn trong mng:
220
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
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}
};
th s to ra mt mng 3x4.
V d, chng ta c th khai bo mng s nguyn hai chiu khc kch thc tn myJaggedArray nh sau:
int [] [] myJaggedArray;
V d 9.6 to ra mng khc kch thc tn myJaggedArray, khi to cc thnh phn, ri sau
in ra mn hnh. tit kim thi gian, chng ta s dng mng cc s nguyn cc thnh
phn ca n c t ng gn gi tr mc nh. V ta ch cn gn mt s gi tr cn thit.
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
Ngn Ng Lp Trnh C#
Sau khi to cc dng cho mng xong, ta thc hin vic a cc gi tr vo cc thnh phn ca
mng. V cui cng l xut ni dung ca mng ra mn hnh.
Ghi ch: Khi chng ta truy cp cc thnh phn ca mng kch thc bng nhau, chng ta
t tt c cc ch mc ca cc chiu vo trong cng du ngc vung:
rectangularArray[i,j]
Tuy nhin vi mng c kch thc khc nhau ta phi tng ch mc ca tng chiu trong
u ngoc vung ring:
jaggedArray[i][j]
Chuyn i mng
Nhng mng c th chuyn i vi nhau nu nhng chiu ca chng bng nhau v nu
cc kiu ca cc thnh phn c th chuyn i c. Chuyn i tng minh gia cc mng
xy ra nu cc thnh phn ca nhng mng c th chuyn i tng minh. V ngc li,
chuyn i ngm nh ca mng xy ra nu cc thnh phn ca nhng mng c th chuyn
i ngm nh.
Nu mt mng cha nhng tham chiu n nhng i tng tham chiu, mt chuyn i c
th c ti mt mng ca nhng i tng c s. V d 9.7 minh ha vic chuyn i mt
mng kiu 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
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
232
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Value: Who
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];
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#
---------------------------------------------------------------------------- Kt qu:
lbt[0]: Hello
lbt[1]: Universe
lbt[2]: Who
lbt[3]: is
lbt[4]: Ngoc
lbt[5]: Mun
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#
---------------------------------------------------------------------------- Kt qu:
lbt[0]: Hi
lbt[1]: Universe
lbt[2]: Who
241
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
lbt[3]: is
lbt[4]: Ngoc
lbt[5]: Mun
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)];
Giao din tp hp
Mi trng .NET cung cp nhng giao din chun cho vic lit k, so snh, v to cc tp
hp. Mt s cc giao din trong s c lit k trong bng 9.2 sau:
Giao din
IEnumerable
ICollection
IComparer
IList
Mc ch
Lit k thng qua mt tp hp bng cch s dng
foreach.
Thc thi bi tt c cc tp hp cung cp phng
thc CopyTo() cng nh cc thuc tnh Count,
ISReadOnly, ISSynchronized, v SyncRoot.
So snh gia hai i tng lu gi trong tp hp
sp xp cc i tng trong tp hp.
S dng bi nhng tp hp mng c ch mc
242
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
IDictionary
IDictionaryEnumerator
phi thc thi nhng phng thc v thuc tnh IEnumerator. Chng c th c
thc thi trc tip trong lp cha (trong trng hp ny l lp ListBoxTest) hay bi mt lp
phn bit khc. Cch tip cn th hai thng c s dng nhiu hn, do chng c ng
gi trong lp Enumerator hn l vic phn vo trong cc lp cha.
Do lp Enumerator c xc nh cho lp cha, v theo nh trn th lp ListBoxEnumerator
phi bit nhiu v lp ListBoxTest. Nn chng ta phi to cho n mt s thc thi ring cha
bn trong lp ListBoxTest. Lu rng phng thc GetEnumerator truyn i tng ListBoxTest hin thi (this) cho enumerator. iu ny cho php enumerator c th lit k c
cc thnh phn trong tp hp ca i tng ListBoxTest. y lp thc thi Enumerator l
ListBoxEnumerator, y l mt lp private c nh ngha bn trong lp ListBoxTest. Lp
ny thc thi n gin bao gm mt thuc tnh public, v hai phng thc public l
MoveNext(), v Reset(). i tng ListBoxTest c truyn vo nh mt i mc ca b
khi to. y n c gn cho bin thnh vin myLBT. Trong hm khi to ny cng thc
hin thit lp gi tr bin thnh vin index l -1, ch ra rng cha bt u thc hin vic
enumerator i tng:
Enumerator
Phng thc MoveNext() gia tng index v sau kim tra m bo rng vic thc hin
khng vt qu s phn t trong tp hp ca i tng:
public bool MoveNext()
243
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
{
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++)
{
//...
}
Mc ch
Phng thc static to mt wrapper ArrayList cho i
tng IList
Phng thc static np chng tr v sanh sch i tng
nh l mt wrapper. Danh sch c kch thc c nh, cc
thnh phn ca n c th c sa cha nhng khng th
thm hay xa.
248
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
ReadOnly()
Repeat()
Synchronized()
Capacity
Count
IsFixedSize
IsReadOnly
IsSynchronized
Item()
SyncRoot
Add()
AddRange()
BinarySearch()
Clear()
Clone()
Contains()
CopyTo()
GetEnumerator()
GetRange()
Insert()
InsertRange(0
IndexOf()
249
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
LastIndexOf()
Remove()
RemoveAt()
RemoveRange()
Reverse()
SetRange()
Sort()
ToArray()
TrimToSize()
Xa mt dy cc thnh phn.
o th t cc thnh phn trong mng.
Sao chp nhng thnh phn ca tp hp qua dy nhng
thnh phn trong ArrayList.
Sp xp ArrayList.
Sao chp nhng thnh phn ca ArrayList n mt mng
mi.
Thit lp kch thc tht s cha cc thnh phn trong
ArrayList
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
100
10
15
101
102
20
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;}
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
thc thi giao din IComparable, i tng Employee phi cung cp mt phng thc
CompareTo():
public int CompareTo(Object o)
{
Employee r = (Employee) o;
return this.empID.CompareTo(r.empID);
}
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
105
103
102
5
103
107
7
104
102
105
107
8
104
255
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Khi chng ta gi Sort() th ArrayList s gi phng thc Compare() trong EmployeeComparer, n lt n s y quyn vic so snh cho phng thc Employee.CompareTo(),
v truyn vo thuc tnh WhichComparision ca n:
Compare(object lhs, object rhs)
{
Employee l = (Employee) lhs;
Employee r = (Employee) rhs;
return l.CompareTo(r.WhichComparision);
}
i tng Employee phi thc thi mt phin bn ring ca CompareTo() thc hin vic so
snh:
256
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Sau y l v d 9.14 th hin y vic thc thi IComparer cho php thc hin sp xp
theo hai tiu chun khc nhau. Trong v d ny mng s nguyn c xa i lm cho n
gin ha v d.
V d 9.14: Sp xp mng theo tiu chun ID v nm cng tc.
----------------------------------------------------------------------------namespace Programming_CSharp
{
using System;
using System.Collections;
//lp n gin lu tr trong mng
public class Employee : IComparable
{
public Employee(int empID)
{
this.empID = empID;
}
public Employee(int empID, int yearsOfSvc)
{
this.empID = empID;
this.yearsOfSvc = yearsOfSvc;
}
public override string ToString()
{
return ID: +empID.ToString() + . Years of Svc:
+ yearsOfSvc.ToString();
}
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
ID: 100. Years of Svc: 16
ID: 101. Years of Svc: 3
ID: 102. Years of Svc: 8
ID: 105. Years of Svc: 0
ID: 107. Years of Svc: 17
ID: 105. Years of Svc: 0
ID: 101. Years of Svc: 3
ID: 102. Years of Svc: 8
ID: 100. Years of Svc: 16
ID: 107. Years of Svc: 17
----------------------------------------------------------------------------260
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Hng i (Queue)
Hng i l mt tp hp trong c th t vo trc v ra trc (FIFO). Tng t nh l
nhng ngi mua v tu, h xp thnh mt hng, ngi no vo trc th s mua trc v ra
trc. Hng i l kiu d liu tt qun l nhng ngun ti nguyn gii hn. V d, chng
ta mun gi thng ip n mt ti nguyn m ch x l c duy nht mt thng ip mt
ln. Khi chng ta s thit lp mt hng i thng ip x l cc thng ip theo th t
a vo.
Lp Queue th hin kiu d liu nh trn, trong bng 9.4 sau lit k nhng phng thc v
thuc tnh thnh vin.
Phng thc- thuc tnh
Synchronized()
Count
IsReadOnly
IsSynchronized
SyncRoot
Clear()
Clone()
Contains()
CopyTo()
Dequeue()
Enqueue()
GetEnumerator()
Peek()
Mc ch
Phng thc static tr v mt Queue wrapper c
thread-safe.
Thuc tnh tr v s thnh phn trong hng i
Thuc tnh xc nh hng i l ch c
Thuc tnh xc nh hng i c ng b
Thuc tnh tr v i tng c th c s dng
ng b truy cp Queue.
Xa tt c cc thnh phn trong hng i
To ra mt bn sao
Xc nh xem mt thnh phn c trong mng.
Sao chp nhng thnh phn ca hng i n mng
mt chiu tn ti
Xa v tr v thnh phn bt u ca hng i.
Thm mt thnh phn vo hng i.
Tr v mt enumerator cho hng i.
Tr v phn t u tin ca hng i v khng xa n.
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:
Dequeue
10
10
15
20
15
20
intQueue values:
Peek
intQueue values:
Dequeue
10
15
20
10
15
20
10
intQueue values:
Ngn xp (stack)
Ngn xp l mt tp hp m th t l vo trc ra sau hay vo sao ra trc (LIFO), tng
nh mt chng a c xp trong nh hng. a trn cng tc l a xp sau th c ly
ra trc do vy a nm di y tc l a a vo u tin s c ly ra sau cng.
Hai phng thc chnh cho vic thm v xa t stack l Push v Pop, ngoi ra ngn xp cng
a ra phng thc Peek tng t nh Peek trong hng i. Bng 9.5 sau minh ha cc
phng thc v thuc tnh ca lp Stack.
Phng thc- thuc tnh
Synchronized()
Mc ch
Phng thc static tr v mt Stack wrapper
c thread-safe.
263
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Count
IsReadOnly
IsSynchronized
SyncRoot
Clear()
To ra mt bn sao
Xc nh xem mt thnh phn c trong mng.
Clone()
Contains()
CopyTo()
Pop()
Push()
GetEnumerator()
a mt i tng vo u ngn xp
Tr v mt enumerator cho ngn xp.
Tr v phn t u tin ca ngn xp v khng
xa n.
Sao chp nhng thnh phn qua mt mng mi
Peek()
ToArray()
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:
Pop
35
30
25
20
15
10
30
25
20
15
10
25
20
15
10
25
20
15
10
800
35
intStack values:
Pop
30
intStack values:
Peek
25
intStack values:
Target array:
0
100
200
300
400
500
600
700
100
200
300
400
500
25
20
15
10
20
15
10
Kiu t in
266
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Tuy nhin, tht khng thun tin khi khi truy cp cc th ph ca cc bang thng qua cu trc
mng nh vy. Gi s nu chng ta mun truy cp th ph ca bang Massachusett, khng
phi d dng xc nh rng th t ca bang l th 21 theo alphabe.
Mt cch thun tin hn l lu tr th ph theo tn ca bang. Mt t in cho php chng ta
lu tr mt gi tr (trong trng hp ny l th ph) v vi mt kha truy cp (l tn ca
bang). Kiu d liu t in trong .NET Framework c th kt hp bt c kiu kha no nh
kiu chui, s nguyn, i tng...vi bt c kiu gi tr no (chui, s nguyn, kiu i
tng).
Thuc tnh quan trng ca mt t in tt l d thm gi tr mi vo, v nhanh chng truy cp
n gi tr. Mt vi t in th nhanh hn v thi gian thm mt gi tr mi vo, mt s khc
th ti u cho vic truy cp. Mt trong minh ha cho kiu t in l kiu d liu hashtable
hay cn gi l bng bm.
Hashtables
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.
Hashtable
Mc ch
Phng thc static tr v mt Hashtable wrapper
c thread-safe.
Thuc tnh tr v s thnh phn trong hashtable
Thuc tnh xc nh hashtable l ch c
Thuc tnh xc nh hashtable c ng b
Thuc tnh tr v i tng c th c s dng
ng b truy cp Hastable.
267
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
Keys
Values
Add()
Clear()
Item()
Clone()
Contains()
ContainsKey()
CopyTo()
GetEnumerator()
GetObjectData()
OnDeserialization
Remove()
Ngn Ng Lp Trnh C#
Thuc tnh Item c thc thi trong ngn ng C# vi ton t ch mc ([]). Do vy chng ta
c th truy cp nhng item trong bt c i tng t in bng c php ging nh truy cp
mng.
V d 9.17 minh ha vic thm mt item vo trong bng Hashtable v sau truy cp li
chng thng qua thuc tnh Item.
V d 9.17: thuc tnh Item tng nh nh ton t offset.
----------------------------------------------------------------------------namespace Programming_CSharp
{
using System;
using System.Collections;
public class Tester
{
static void Main()
{
// to v khi to hashtable
Hashtable hashTable = new Hashtable();
hashTable.Add(00440123,Ngoc Thao);
hashTable.Add(00123001,My Tien);
hashTable.Add(00330124,Thanh Tung);
// truy cp qua thuc tnh Item
Console.WriteLine(myHashtable[\00440123\]: {0},
hashTable[00440123]);
269
Mng, Ch Mc, v Tp Hp
Ngn Ng Lp Trnh C#
}
}
}
---------------------------------------------------------------------------- Kt qu:
hashTable[00440123]:
Ngoc Thao
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
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);
---------------------------------------------------------------------------- Kt qu:
hashTableg
Count:
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
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;
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;
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.
Ngn Ng Lp Trnh C#
ngha
Trng public static th hin mt chui rng.
Phng thc public static so snh hai chui.
Phng thc public static so snh hai chui khng
quan tm n th t.
Phng thc public static to chui mi t mt hay
nhiu chui.
Copy()
Equal()
Format()
Intern()
IsInterned()
Join()
Chars()
Length()
Clone()
CompareTo()
CopyTo()
EndsWidth()
Insert()
LastIndexOf()
PadLeft()
PadRight()
X L Chui
Ngn Ng Lp Trnh C#
Remove()
Xa i mt s k t xc nh.
Split()
StartWidth()
Ly mt chui con.
Sao chp nhng k t t mt chui n mng k t.
SubString()
ToCharArray()
ToLower()
ToUpper()
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.
Xa nh nhng v tr cui.
Trim()
TrimEnd()
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.
----------------------------------------------------------------------------TrimStart()
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
----------------------------------------------------------------------------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#
Cch so snh th hai dng phin bn np chng Compare() ly ba tham s. Tham s Boolean
quyt nh b qua hay khng b qua vic so snh phn bit ch thng v ch hoa. Tham s
ny c th b qua. Nu gi tr ca tham s l true th vic so snh s b qua s phn bit ch
thng v ch hoa. Vic so snh sau s khng quan tm n kiu loi ch:
// Tham s th ba l true s b qua kim tra k t thng hoa
result = string. Compare(s1, s2, true);
Console.WriteLine(Khong phan biet chu thuong va hoa\n);
Console.WriteLine(S1: {0} , S2: {1}, ket qua : {2}\n, s1, s2, result);
V d minh ha 10.1 trn tip tc vi vic ni cc chui li vi nhau. y s dng hai cch
ni lin hai chui. Chng ta c th s dng phng thc Concat() y l phng thc
public static ca string:
string s4 = string.Concat(s1, s2);
Hay cch khc n gin hn l vic s dng ton t ni hai chui (+):
string s5 = s1 + s2;
Trong c hai trng hp th kt qu ni hai chui hon ton thnh cng v nh sau:
283
X L Chui
Ngn Ng Lp Trnh C#
Hoc thun tin hn chng ta c th s dng phng thc np chng ton t (=) thng qua
vic sao chp ngm nh:
string s7 = s6;
Lp String ca .NET cung cp ba cch kim tra bng nhau gia hai chui. u tin l
chng ta c th s dng phng thc np chng Equals() kim tra trc tip rng S6 c
bng S7 hay khng:
Console.WriteLine(S6.Equals(S7) ?: {0}, S6.Equals(S7));
K thut so snh th hai l truyn c hai chui vo phng thc Equals() ca string:
Console.WriteLine(Equals(S6, s7) ?: {0}, string.Equals(S6, S7));
V phng php cui cng l s dng np chng ton t so snh (=) ca String:
Console.WriteLine(S6 == S7 ?: {0}, s6 == s7);
Vic so snh bng nhau gia hai chui l vic rt t nhin v thng c s dng. Tuy
nhin, trong mt s ngn ng, nh VB.NET, khng h tr np chng ton t. Do chc
chn chng ta nn s dng phng thc Equals() l tt nht.
Cc on chng trnh tip theo ca v d 10.1 s dng ton t ch mc ([]) tm ra k t
xc nh trong mt chui. V dng thuc tnh Length ly v chiu di ca ton b mt
chui:
Console.WriteLine(\nChuoi S7 co chieu dai la : {0}, s7.Length);
Console.WriteLine(Ky tu thu 3 cua chuoi S7 la : {0}, s7[2] );
Kt qu l:
Chuoi S7 co chieu dai la : 8
Ky tu thu 3 cua chuoi S7 la : c
Phng thc EndsWith() hi xem mt chui c cha mt chui con v tr cui cng hay
khng. Do vy, chng ta c th hi rng chui S3 c kt thc bng chui CNTT hay chui
Nam:
// Kim tra xem mt chui c kt thc vi mt nhm k t xc nh hay khng
284
X L Chui
Ngn Ng Lp Trnh C#
V kt qu tm c l 18:
Tim vi tri xuat hien dau tien cua chu CNTT
trong chuoi S3 l 18
Chng ta c th chn vo chui t nhan luc v theo sau chui ny l mt khong trng vo
trong chui ban u. Khi thc hin th phng thc tr v bn sao ca chui c chn
vo chui con mi v c gn li vo chui S8:
string s8 = s3.Insert(18, nhan luc );
Console.WriteLine( S8 : {0}\n, s8);
Kt qu a ra l:
S8 : Trung Tam Dao Tao nhan luc CNTT
Thanh pho Ho Chi Minh Viet Nam
Cui cng, chng ta c th kt hp mt s cc php ton thc hin vic chn nh sau:
string s9 = s3.Insert( s3.IndexOf( CNTT ) , nhan luc );
Console.WriteLine( S9 : {0}\n, s9);
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) )
Phng thc
Capacity()
Chars()
Length()
MaxCapacity()
Append()
AppendFormat()
EnsureCapacity()
Insert()
Replace()
System.StringBuilder
ngha
Truy cp hay gn mt s k t m StringBuilder nm gi.
Ch mc.
Thit lp hay truy cp chiu di ca chui
Truy cp dung lng ln nht ca StringBuilder
Ni mt kiu i tng vo cui ca StringBuilder
Thay th nh dng xc nh bng gi tr c nh dng
ca mt i tng.
m bo rng StringBuilder hin thi c kh nng ti thiu
ln nh mt gi tr xc nh.
Chn mt i tng vo mt v tr xc nh
Thay th tt c th hin ca mt k t xc nh vi nhng
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#
int id = 1;
// s dng vng lp ly cc chui con
foreach ( string subString in theRegex.Split(s1))
{
// ni chui va tm c trong biu thc quy tc
// vo chui StringBuilder theo nh dng sn.
sBuilder.AppendFormat({0}: {1} \n, id++, subString);
}
Console.WriteLine({0}, sBuilder);
}// end Main
}// end class
}// end namespace
---------------------------------------------------------------------------- Kt qu:
1: Mot
2: hai
3: ba
4: Trung
5: Tam
6: Dao
7: Tao
8: CNTT
Tp theo mt biu thc quy tc c to ra, biu thc ny c dng tm kim mt chui:
Regex theRegex = new Regex( |, );
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 mt biu thc quy tc thc hin vic tm kim trn chui string1:
Regex theReg = new Regex(@(\S+)\s);
296
X L Chui
Ngn Ng Lp Trnh C#
297
X L Chui
Ngn Ng Lp Trnh C#
Chui ny c th c tm thy trong ni dung ca cc tp tin log ghi nhn cc thng tin
web server hay t cc kt qu tm kim c trong c s d liu. Trong v d n gin ny c
ba ct, mt ct u tin ghi nhn thi gian, ct th hai ghi nhn a ch IP, v ct th ba ghi
nhn a ch web. Mi ct c ngn cch bi khong trng. D nhin l trong cc ng dng
thc t ta phi gii quyt nhng vn phc tp hn na, chng ta c th cn phi thc hin
vic tm kim phc tp hn v s dng nhiu k t ngn cch hn na.
Trong v d ny, chng ta mong mun l to ra mt i tng Regex tm kim chui con
yu cu v phn chng vo trong ba nhm: time, a ch IP, v a ch web. Biu thc quy tc
y cng kh n gin, do cng d hiu.
y chng ta quan tm n nhng k t to nhm nh:
<?<time>
V kt qu ca v d l:
theMatch: 10:20:30 127.0.0.0 Dolphin.net
Sau chng trnh ly nhm time t tp hp nhm ca Match v xut ra mn hnh bng cc
lnh nh sau:
Console.WriteLine(time: {0}, theMatch.Groups[time]);
Kt qu l :
Time: 10:20:30
Ngn Ng Lp Trnh C#
Ta nhn c kt qu:
IP: 127.0.0.0
Site: Dolphin.net
Trong v d 10.8 trn th tp hp Match ch so khp duy nht mt ln. Tuy nhin, n c th so
khp nhiu hn na trong mt chui. lm c iu ny, chng ta c th b sung chui
tm kim c ly t trong mt log file nh sau:
String string1 = 10:20:30 127.0.0.0 Dolphin.net +
10:20:31 127.0.0.0 Mun.net +
10:20:32 127.0.0.0 Msn.net ;
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);
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
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
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
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);
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];
}
307
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Vic thc hin cng tng t nh phng thc Sort. Tuy nhin, phng thc thc hin
vic hon i nu phng thc y quyn xc nh l i tng trc ti trc. Do vy, kt
qu thc hin ca phng thc l i tng th hai s n trc. Lc ny nu chng ta truyn
vo l Amy, Beth, phng thc y quyn s tr v theFirstComesFirst, v phng thc
ReverseSort s hon i v tr ca hai i tng ny, thit lp Beth n trc. iu ny cho
php chng ta s dng cng phng thc y quyn tng t nh Sort, m khng cn yu cu
i tng h tr phng thc tr v gi tr c sp ngc.
308
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
309
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Cng tng t nh lp Student th lp Cat cng ph quyt phng thc ToString() v thc
thi mt phng thc tnh vi c php tng ng vi phng thc y quyn. V chng ta cng
lu l phng thc y quyn ca Student v Cat l khng cng tn vi nhau. Chng ta
khng cn thit phi lm cng tn v chng ta s gn n phng thc y quyn lc thc thi.
V d minh ha 11.1 sau trnh by cch mt phng thc y quyn c gi.
V d 11.1: Lm vic vi y quyn.
----------------------------------------------------------------------------namespace Programming_CSharp
{
using System;
// khai bo kiu lit k
public enum comparison
{
theFirstComesFirst =1,
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#
Ba = new Student(Ba);
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
Meo
: Thao, Ba
: 5, 2
: Ba, Thao
: Thao, Ba
: 2, 5
: 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);
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);
: Ba, Thao
: 2, 5
: 5, 2
y quyn tnh
Nh chng ta thy trong v d minh ho 11.1 trc th hai th hin phng thc y
quyn c khai bo bn trong lp gi (chnh xc l trong hm 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);
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());
316
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
317
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Cui cng, chng ta khai bo nhng y quyn tnh, cc client gi, v chn chng li x
l nhng phng thc:
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect SharpenEffect = new DoEffect(Sharpen);
318
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Vic chn cc thao tc din ra trong qu trnh tng tc thnh phn giao din ngi s
dng. Trong v d ny chng ta m phng bng cch chn cc hiu ng, thm chng vo
trong mng, v ProcessImage.
V d minh ha 11.2: S dng mng y quyn.
----------------------------------------------------------------------------namespace Programming_CSharp
{
using System;
// khai bo lp nh
public class Image
{
public Image()
{
Console.WriteLine(An image created);
}
}
// lp x l nh
public class ImageProcessor
{
// khai bo y quyn
public delegate void DoEffect();
// to cc y quyn tnh
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect SharpenEffect = new DoEffect(Sharpen);
public DoEffect FilterEffect = new DoEffect(Filter);
public DoEffect RotateEffect = new DoEffect(Rotate);
// b khi dng khi to nh v mng
public ImageProcessor(Image image)
{
this.image = image;
arrayOfEffects = new DoEffect[10];
}
// thm hiu ng vo trong mng
public void AddToEffects( DoEffect theEffect)
{
if (numEffectsRegistered >=0)
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#
---------------------------------------------------------------------------- Kt qu:
An image created
Blurring image
Filtering image
Rotate image
Sharpening image
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#
Chng ta cng c th thm nhng y quyn vo trong y quyn Multicast bng ton t cng
bng (+=). Php ton ny s thm y quyn pha bn phi ca ton t vo y quyn
Multicast bn tri. V d minh ha nh sau, gi s c Transmitter v myMulticastDelegate
l nhng y quyn, lnh tip theo sau y s thc hin vic thm y quyn Transmitter vo
trong myMulticastDelegate:
myMulticastDelegate += Transmitter;
myMulticastDelegate;
322
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Tip theo chng ta thm vo delegate ny mt delegate na bng cch s dng ton t (+=):
myMulticastDelegate += Transmitter;
Cui cng, chng ta thc hin vic xa deleagate bng s dng ton t (-=):
DelegateCollector -= Logger;
323
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
myMulticastDelegate;
324
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
---------------------------------------------------------------------------- Kt qu:
Writing string String passed to Writer
Logging string String passed to Logger
Transmitting string String passed to Transmitter
myMulticastDelegate = Writer + Logger
Writing string First string passed to Collector
Logging string First string passed to Collector
myMulticastDelegate += Transmitter
Writing string Second string passed to Collector
Logging string Second string passed to Collector
Transmitting string Second string passed to Collector
myMulticastDelegate -= Logger
Writing string Third string passed to Collector
Transmitting string Third string passed to Collector
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#
OnSecondChange;
327
C Ch y Quyn - S Kin
Ngn Ng Lp Trnh C#
Phng thc Run to vng lp v hn kim tra nh k thi gian h thng. Nu thi gian
thay i t i tng Clock hin hnh, th n s cnh bo cho tt c cc subscriber v sau
cp nht li nhng trng thi ca n.
Bc u tin l ngng 10 giy:
Thread.Sleep(10);
C khong 100 ln kim tra, th mt giy s c gia tng. Phng thc ghi nhn s thay i
v cnh bo n nhng subscriber ca n. lm c iu ny, u tin phi to ra mt i
tng TimeInfoEventArgs:
if ( dt.Second != second)
{
// to TimeInfoEventArgs truyn cho cc subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
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);
}
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 SecondChangeHandler 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#
----------------------------------------------------------------------------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
Lp v th mc & h thng
Lp Math
Lp thao tc tp tin
Cu hi & bi tp
Ngn Ng Lp Trnh C#
Ngn Ng Lp Trnh C#
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#
// khng lm g ht!
}
}
public static void DisplayTimeEvent( object source, ElapsedEventArgs t)
{
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(**************************);
}
}
}
----------------------------------------------------------------------------Nh chng ta thy th nhng thnh vin tnh ca lp Environment cung cp cho ta nhng
thng tin h thng v mi trng. u tin l lnh thc hin c a ra chnh l chng
trnh ang thc thi tc l chng trnh Env01.exe, thuc tnh c dng ly l CommandLine. Th mc hin hnh chnh l th mc cha chng trnh thc thi thng qua thuc tnh
CurrentDirectory. Tng t nh vy cc thuc tnh h thng nh: th mc h thng, phin
bn OS, tn my tnh, b nh cng c ly ra.
Tip theo l hai phng thc ca lp Environment tr v mng chui k t, bao gm phng
thc ly i mc dng lnh 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
Tr v gi tr nh nht hay bng gi tr a ra
Ceiling
Exp
Floor
IEEERemainder
Log
Log10
Max
Min
Pow
Round
Sign
Sqrt
Acos
Asin
Atan
Atan2
Cos
Cosh
Sin
Tr v gi tr e vi m a ra
Tr v gi tr ln nht hay bng gi tr a ra
Tr v phn d ca php chia hai hai s thc. Php
chia ny theo tiu chun ca IEEE cho php ton du
chm ng nh phn.
Tr v gi tr logarit ca gi tr a ra
Tr v gi tr logarit c s 10 ca s a ra
Tr v s ln trong hai s
Tr v s nh trong hai s
Tr v kt qu xy
Tr v gi tr c lm trn
Tr v gi tr du ca mt s. -1 nu s m v 1 nu
s dng
Tr v cn bc hai ca mt s
Tr v gi tr mt gc m cosin bng vi gi tr a ra
Tr v gi tr mt gc m sin bng vi gi tr a ra
Tr v gi tr ca mt gc m tang bng vi gc a
ra
Tr v gi tr ca mt gc m tang bng vi tang ca
im (x,y) a ra
Tr v gi tr cosin ca mt gc a ra
Tr v gi tr hyperbolic cosin ca gc a ra
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
Tr v gi tr hyperbolic tang ca gc.
Tanh
---------------------------------------------------------------------------- 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
To ra mt tp tin mi t tp tin hin hu
Copy
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
Xa tp tin v tr xc nh. Tp tin phi hin hu
nu khng s pht sinh ra ngoi l.
Delete
Exists
GetAttributes
GetCreationTime
GetLastAccessTime
GetLastWriteTime
Move
Open
OpenRead
OpenText
OpenWrite
SetAttributes
SetCreationTime
SetLastAccessTime
SetLastWriteTime
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!
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]);
}
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.
Ngn Ng Lp Trnh C#
----------------------------------------------------------------------------// Filsize.cs
namespace Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main()
{
string[] CLA = Environment.GetCommandLineArgs();
FileInfo
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#
---------------------------------------------------------------------------- Kt qu:
******************************
filesize.cs
1360
******************************
Last access: 12/5/2002 12:00:00 AM
Last write:
12/5/2002 5:50:50 PM
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
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
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
Dng lnh trn vit mt chui vo trong tp tin, vic vit ny ging nh l vit ra mn hnh
console. Nhng y l c vit ra thit b khc, tc l ra tp tin. Sau khi thc hin ton b
cng vic, cn thit phi ng lung li bng cch gi phng thc Close.
c tp tin vn bn
c d liu t tp tin vn bn cng tng t nh vic vit thng tin vo n. V d minh
ha tip sau y thc hin vic c tp tin m chng ta to ra t chng trnh minh ha
12.7 trc. y l chng trnh c tp tin vn bn.
V d 12.8: c mt tp tin vn bn.
----------------------------------------------------------------------------using System;
using System.IO;
namespace Programming_CSharp
{
public class Tester
{
public static void Main(string[] args)
{
if ( args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin);
}
else
{
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();
}
}
}
}
Ngn Ng Lp Trnh C#
358
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
}
}
}
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.
Programming_CSharp
{
using System;
using System.IO;
public class Tester
{
public static void Main( String[] args)
{
if ( args.Length < 1)
{
Console.WriteLine(Phai nhap ten tap tin);
}
else
{
FileStream myFile = new FileStream( args[0], FileMode.Open);
BinaryReader brFile = new BinaryReader(myFile);
// c d liu
Console.WriteLine(Dang doc tap tin....);
while (brFile.PeekChar() != -1)
{
Console.Write(<{0}>, brFile.ReadInt32());
}
Console.WriteLine(....Doc xong);
brFile.Close();
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());
}
Ngn Ng Lp Trnh C#
ngha
Read
ReadBoolean
ReadByte
ReadBytes
ReadChar
ReadChars
ReadDecimal
ReadDouble
ReadInt16
ReadInt32
ReadInt64
ReadSByte
ReadSingle
ReadString
ReadUInt16
Cc Lp C S .NET
Ngn Ng Lp Trnh C#
ReadUInt64
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
Pht sinh v bt gi ngoi l
Cu lnh throw
Cu lnh catch
Cu lnh finally
To ring cc ngoi l
Cu hi & bi tp
Ngn Ng Lp Trnh C#
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#
---------------------------------------------------------------------------- Kt qu:
Enter
Main....
Enter
Func1...
Enter
Func2...
----------------------------------------------------------------------------V d minh ha n gin ny vit ra mn hnh console thng tin khi n nhp vo trong mt
hm v chun b i ra t mt hm. Hm Main() to th hin mi ca kiu Test v sau gi
hm Func1(). Sau khi in thng ip Enter Func1, hm Func1() ny gi hm Func2(). Hm
Func2() in ra thng ip u tin v pht sinh mt ngoi l kiu System.Exception. Vic thc
thi s ngng ngay tc khc, v CLR s tm kim trnh x l ngoi l trong hm Func2(). Do
khng tm thy y, CLR tip tc vo stack ly hm gi trc tc l Func1 v tm kim
367
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...
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 DivideByzeroException nu chng ta thc hin chia vi zero. Trong ton hc vic ly zero chia cho
mt s khc l c php, nhng trong v d minh ha ca chng ta khng cho php thc
hin vic ny, nu thc hin s pht sinh ra mt ngoi l ArithmeticException.
Khi mt ngoi l c pht sinh, CLR s kim tra mi khi x l ngoi l theo th t v s
ly khi u tin thch hp. Khi chng ta thc hin vi a=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!
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
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
Trc khi pht sinh ra ngoi l, chng ta thit lp thuc tnh HelpLink nh sau:
e.HelpLink = http://www.hcmunc.edu.vn;
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);
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.
CC LP NGOI L
M t
Tn ngoi l
MethodAccessException
ArgumentException
ArgumentNullException
ArithmeticException
ArrayTypeMismatchException
DivideByZeroException
FormatException
IndexOutOfRangeException
InvalidCastException
MulticastNotSupportedException
NotFiniteNumberException
NotSupportedException
NullReferenceException
OutOfMemoryException
OverflowException
StackOverflowException
TypeInitializationException
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#
divisor);
e.HelpLink = http://www.hcmuns.edu.vn;
throw e;
}
return a/b;
}
}
}
----------------------------------------------------------------------------381
X L Ngoi L
Ngn Ng Lp Trnh C#
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#
C php thc hin pht sinh li cng mt ngoi l m khng c bt c b sung hay hiu
chnh no l : throw.
Do vy ngoi l c pht sinh cho DangerousFunc2(), khi catch trong DangerousFunc2()
thc hin mt vi hnh ng v tip tc pht sinh mt ngoi l c kiu mi. Trong hm khi
dng ca ngoi l mi, DangerousFunc2() truyn mt chui thng ip mi (E2 - Func2
caught divide by zero) v ngoi l ban u. Do vy ngoi l ban u (E1) tr thnh ngoi l
bn trong ca ngoi l mi (E2). Sau hm DangerousFunc2() pht sinh ngoi l ny (E2)
cho hm DangerousFunc1().
DangerousFunc1() bt gi ngoi l ny, lm mt s cng vic v to ra mt ngoi l mi c
kiu l MyCustomException, truyn vo hm khi dng ca ngoi l mi mt chui mi
(E3 Custom Exception Situation!) v ngoi l c bt gi (E2). Chng ta nn nh rng
ngoi l c bt gi l ngoi l c cha ngoi l DivideByZeroException (E1) bn trong n.
Ti thi im ny, chng ta c mt ngoi l kiu MyCustomException (E3), ngoi l ny cha
bn trong mt ngoi l kiu Exception (E2), v n lt n cha mt ngoi l kiu
DivideByZeroException (E1) bn trong. Sau cng ngoi l c pht sinh cho hm TestFunc;
Khi khi catch ca TestFunc thc hin n s in ra thng ip ca ngoi l :
E3 Custom Exception Situation!
385
X L Ngoi L
Ngn Ng Lp Trnh C#
Console.WriteLine({0}, inner.Message);
inner = inner.InnerException;
}
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;
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);
}
}
388
X L Ngoi L
Ngn Ng Lp Trnh C#
389
Dng Visual Studio .NET Xy Dng ng Dng Windows Form